情報工学科 3年生対象 専門科目 システムプログラミング 第1回 導入 第2回 Linux、分割コンパイル 情報工学科 篠埜 功.

Slides:



Advertisements
Similar presentations
システムプログラミング 情報工学科 篠埜 功 情報工学科 3 年生対象 専門科目 第5回 シェルスクリプトの続 き レポート課題 main 関数の引数 usage メッセージ.
Advertisements

JXTA Shell (3) P2P特論 (ソフトウェア特論) 第6回 /
シェル シェルスクリプト 最低限vi 山下 達也 (北大理・宇宙理学専攻) INEX 第4回/最低限 UNIX(Linux) その3
2014年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
Unix生活 Vol.1
シェル シェルスクリプト 最低限vi 山下 達也 (北大理・宇宙理学専攻) INEX 第4回/最低限 UNIX(Linux) その3
2015年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
1.コンピュータと情報処理 p.20 第1章第1節 3.ソフトウェア ソフトウェア 基本ソフトウェア
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第2回 UNIX・Linuxの基礎 担当:青木義満
Android と iPhone (仮題) 情報社会とコンピュータ 第13回
Java I 第2回 (4/18)
第3回 ファイルとフォルダ 伊藤 高廣 計算機リテラシーM 第3回 ファイルとフォルダ 伊藤 高廣
2013年度 プログラミングⅡ ~ Cプログラミングやってみよう ~.
システムプログラミング 第6回、7回 main関数の引数 usageメッセージ システムコールのエラーメッセージ ファイル
山田 由貴子 (北大理・地球惑星科学専攻) 2004年10月29日
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
プログラミング入門2 第1回 導入 情報工学科 篠埜 功.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
ファイルシステムとコマンド.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第1回 イントロダクション 担当:青木義満
情報工学科 3年生対象 専門科目 システムプログラミング 第2回 UNIX・Linuxの基礎(1) 担当:青木義満.
講 義 ガ イ ダ ン ス オペレーティングシステム 第1回.
情報科学1(G1) 2016年度.
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
講 義 ガ イ ダ ン ス オペレーティングシステム 10/4/07.
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
UNIXについて 松野秀平.
スクリプト言語を用いたPHITSの連続実行
情報工学科 3年生対象 専門科目 システムプログラミング 第1回 導入 第2回 Linux、分割コンパイル 情報工学科 篠埜 功.
鯖管のすヽめ.
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
型付きアセンブリ言語を用いた安全なカーネル拡張
ネットワークプログラミング 中村 修.
学籍番号順に着席のこと 001~056までは741教室へ 057~110までは743教室へ
OSの仕組みとその機能 1E16M001-1 秋田 梨紗 1E16M010-2 梅山 桃香 1E16M013-3 大津 智紗子
システムプログラミング 第3回、第4回、第5回、第6回 情報工学科 篠埜 功 makeコマンド 動的リンクライブラリ シェルスクリプト
実行時情報に基づく OSカーネルのコンフィグ最小化
第7回 授業計画の修正 中間テストの解説・復習 前回の補足(クロックアルゴリズム・PFF) 仮想記憶方式のまとめ 特別課題について
パソコンのしくみ ハードウェア OS(Operating System) アプリケーション NEC DOS
JXTA Shell (1) P2P特論 (ソフトウェア特論) 第4回 /
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング 第6回 システムプログラミング概要 プロセスの生成 担当:青木義満
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
UNIX演習 情報ネットワーク特論.
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
JXTA Shell (2) P2P特論 (ソフトウェア特論) 第5回 /
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
Linux の世界に 触れてみよう! 情報実験 第 3 回 (2005/10/21)
UNIX演習 情報ネットワーク特論資料.
コンパイラ 2012年10月1日
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
システムプログラミング 第6回 システムコールのエラーメッセージ ファイルシステム 情報工学科 篠埜 功.
システムプログラミング 第10回 プロセス間通信3 簡易Web server(準備) Chat プログラム 担当:青木義満、篠埜 功
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
ネットワーク・プログラミング Linuxシステムとソフトウェア開発.
Make の使い方.
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング演習II 2003年11月19日(第6回) 木村巌.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

情報工学科 3年生対象 専門科目 システムプログラミング 第1回 導入 第2回 Linux、分割コンパイル 情報工学科 篠埜 功

講義計画 OSの授業で学んだことをプログラミングを通して体験することを目的とする。 スクリプト言語を用いたプログラミング システムコールを使ったプログラム作成 ファイル操作 プロセス シグナル プロセス間通信 簡易なweb serverを作成する

参考書 C言語によるUNIXシステムプログラミング入門,河野清尊 著,オーム社 ¥2940(税込)

成績評価 レポート課題(50%) 期末試験(50%)

連絡先 篠埜 功 居室: 豊洲校舎 14階 14K32 E-mail: sasano@sic.shibaura-it.ac.jp 篠埜 功 居室: 豊洲校舎 14階 14K32 E-mail: sasano@sic.shibaura-it.ac.jp 講義用ページ: http://www.sic.shibaura-it.ac.jp/~sasano/lecture/lecture.html    ここへスライドのファイルを置く。授業の日程もここに記述する。

Operating Systemとは コンピュータのハードウェアを人間にとって使い易い形にして提供するプログラム ハードウェアの仮想化、抽象化 (例)ファイルシステム --- ファイル単位でデータを扱える(仮想化)。ハードディスクの機種の違いを吸収(抽象化) ハードウェア資源の管理 (例)あるプログラムがあるファイル(test.txtなど)への書き込み中に、別のプログラムがそのファイルに書き込めないようにする ハードウェア資源を効率的に利用 (例)マルチタスク --- 複数のプログラムを(見かけ上)同時に動作させる。(CPUの有効利用)

講義の前提 オペレーティングシステムの講義内容の基本的な部分を理解している C言語によるプログラミングに慣れている 関連科目 オペレーティングシステム,プログラミング入門1,2

本講義の概要 OSについてLinuxを例として体験的に学習 Linux上で、シェル、C言語によるシステムプログラミング Windows ソースコードが公開されている ソースコードが非公開 ※情報工学科ではLinuxなどのUnix系OSに触れておくのは必須。

学習目標 オペレーティングシステムが提供するシステムコールを用いるプログラムが書けるようになる。 ネットワーク、ファイル操作等 ・プログラミングの自由度を広げる。 ・よりOSに近いレベルのプログラム開発を通して  OSの機能に対する理解度を深める。

システムコール システムコール カーネル:Linuxの核をなす部分。ハードウェア、プロセスの管理をする。 カーネル(kernel) ソフトウェア 我々が書く通常の プログラム システムコール カーネル:Linuxの核をなす部分。ハードウェア、プロセスの管理をする。 プログラムからシステムコールを呼び出すことにより、Linux kernelが管理しているハードウェア(ハードディスク、ネットワーク等)にアクセスしたり、他のプロセスと通信を行ったりすることができる。通常は直接システムコールは呼ばず、ライブラリ関数を呼び出す。(ライブラリ関数の中でシステムコールが呼ばれる。)

システムコールの例 User program Data File ・・・・・・・・・・・ fscanf() システムコール read

シェル ユーザーとUNIXシステムの間のインタフェースとして機能するプログラム コマンド入力を受けつけ、解釈し、実行する。 csh, bash, tcsh等がある。(演習室の環境においては、/bin/cshは/bin/tcshへのリンク) [課題] fingerコマンドで各自の使用しているシェルを確認せよ。 $ finger sasano のように、自分のユーザ名を引数として与えればよい。

シェルスクリプト ファイルに保存しておいてプログラムのように実行することができる(シェルスクリプト) シェルでは変数や繰り返し機能を用いることができる。 少し複雑な処理程度であればC言語などでプログラムを書かなくても、シェルの機能で簡単に行うことができる。 ファイルに保存しておいてプログラムのように実行することができる(シェルスクリプト)

シェルスクリプトの例 あるディレクトリ中の、拡張子が.cのファイルすべてに対して、.bakという拡張子をつけてバックアップをとる。以下の内容のファイルをbackup.shという名前で作成せよ。 #!/bin/sh for file in *.c do echo $file cp $file $file.bak done exit 0

課題 ディレクトリを一つ作成し、そのディレクトリ内に.cを拡張子とするファイル(中身は何でもよい)を3つ程度作り、作成したシェルスクリプトをそのディレクトリで実行して確認せよ。

シェルスクリプトの利点 豊富なUNIXコマンド群を有効活用 例えば、 ディレクトリ内にある画像ファイル全てに対して,プログラムによりある処理を施す 複数のファイルから,ある特定の文字列を含むファイルのみに対して何らかの処理をする

UNIXの誕生 UNIX AT&T ベル研究所で1970年代に開発。 当時、MulticsというOSが複雑になり過ぎており、単純なOSを作りたいということで作られた。 最初はアセンブリ言語で書かれていたが、当然移植性が悪かった。移植性を高くするためにC言語が開発され、CでUnixが書きなおされた。Cは高級言語であり、かつ細かい処理も書け、システムプログラミングに最適。

ユーザインタフェース(1) (参考書1.1節) GUI (Graphical User Interface) 画面でメニューやアイコンなどを見ながらマウスなどを使って操作 コマンド名を覚えなくてもアイコンで分かる。(たとえば、Word, Internet Explorerの起動アイコンなど) 1973年 XeroxがAlto(アルト)を開発。初めてGUIを搭載したコンピュータと言われている。 Apple社のMacintosh、Microsoft社のWindows、UNIX系OSのデスクトップ環境(X Window System上)

ユーザインタフェース(2) CLI (Command Line Interface)あるいはCUI (Character User Interface) MS-DOSにおいては、 C:\> などのプロンプトに続いてユーザがコマンドを入力 UNIX系OSにおいては、シェルのプロンプトに続いてユーザがコマンドを入力 コマンド名を覚えなければならない。 Windowsにおいては、MS-DOSのウィンドウ, UNIX系OSのデスクトップ環境においては、端末エミュレータのウィンドウを開くことによりCLIとなる。

GUIとCLIの比較(1) GUIは、マウスなどのポインティングデバイスを用いるので操作に時間がかかる。 (例)短い内容のテキストファイル(This is a test. など)を作成する場合 GUIでは、メインメニュー -> プログラム -> アプリケーション -> テキストエディタ ---- データ入力 ---- ファイル -> 名前を付けて保存 -> 名前の入力 -> 終了 CLIの場合(今、試しに行う。) $ cat > test.txt This is a test. <CTRL-Dを入力> $

GUIとCLIの比較(2) シェルのパイプ機能を使って、複数のコマンドをつなぎあわせて実行したりできる。 (例) lsでファイルが多すぎるときに一画面分ずつ表示 $ ls | less シェルのリダイレクト機能を使って入力元や出力先を切り替える (例) カレントディレクトリのファイル名一覧をファイルに書き出す $ ls > filelist.txt

Linuxの誕生 Linux Finland, ヘルシンキ大学の大学院生,Linus Torvalds(ライナス・トーヴァルド氏)開発,1991年 MINIX(Andrew Tanenbaumが教育用に作成したUnix風OS)を実用化しようとしたが,了承が得られず、Linusが自分で一から開発。インターネット上の多くのUNIXプログラマも協力し,発展

Linuxの特徴 GPLというライセンスに基づいて、誰でも自由に改変・再配布することが可能 他のOSに比べ、低い性能のコンピュータでも軽快に動作 ネットワーク機能やセキュリティーに優れ、安定 必要な機能だけを選んでOSを構築可能 システムの構築・運用に必要なソフトウェア群(コマンド、インストーラ、ユーティリティ)とともに配布。カーネルとこれらのソフトウェアをまとめた配布パッケージをディストリビューション(distribution)という

Linuxの特徴 オープンソース GPL(GNU General Public License) --- copyleft ソースコードが公開されている GPL(GNU General Public License) --- copyleft 改変等は自由だが、改変後の配布時にソースコードを開示しなければならない。 (参考) BSD license (Berkeley Software Distribution License)はcopyleftではない。OSではFreeBSDなど、OS以外ではPostgreSQLなどがBSD license。BSDをベースにしたライセンス(BSD style lisence)ではApache、Python等。

Copyright と Copyleft 使用許諾契約書 Copyleft 通常の商用ソフトウェアは,ソフトウェアの使用に関しての制限を設ける Copyleft フリーソフトウェアの使用に関して他者が制限を設けることを禁じる GPLに従って配布されているソフトウェアの例 gcc: Cコンパイラ emacs: テキストディタ

C言語プログラミング (参考書1.2節) Cコンパイラ(gcc)の使い方 Cコンパイラの処理の流れ(詳細) 静的リンクと動的リンク

gcc(GNU C Compiler)の使い方 (参考書1.2.2節) ($ man gcc で使い方が表示される。) Optionの例 (オプションは書かなくてもよい。) -o name 実行ファイルをnameという名前で生成 -c 分割コンパイル(リンクはしない) -lxxx ライブラリファイルlibxxx.a を検索。libc.aはdefaultでリンク。libm.aは算術演算 ライブラリで,-lmで指定。   $ gcc -print-file-name=libm.a でリンク時に使われる libm.aの絶対パスが表示される。 filenameの拡張子(gccは拡張子によって処理を切り替える) xxxx.c C言語ソースファイル xxxx.s アセンブリ言語ソースファイル(-S オプション) xxxx.o オブジェクトファイル(-c オプション) 他にも拡張子がいくつかある。

ライブラリ ライブラリ 再利用を目的として作成されたコンパイル済み関数群(例:mathライブラリ libm.a 等) 置き場所 /lib, /usr/lib など。 gccはデフォルトでは標準Cライブラリ(libc.a)内の関数しか検索しないため,追加したいライブラリがある場合には明示的に指定する。 算術ライブラリ使用例:  gcc program.c -o program /usr/lib/libm.a もしくは      gcc program.c -o program -lm  (リンカがlibm.aを検索する) -Lオプションでライブラリを探すディレクトリを追加指定できる。

ライブラリ 静的ライブラリ オブジェクトファイルの集合体(拡張子***.a) 例: /usr/lib/libc.a(標準Cライブラリ), /usr/lib/libm.a(算術ライブラリ) ライブラリに格納されている関数を使いたい場合、 関数を宣言しているヘッダーファイルをインクルード プログラム(のコンパイル結果)とライブラリがリンカによって結合され、1つの実行可能プログラムを生成 動的リンクライブラリ dynamic link library(あるいは共有ライブラリ shared library)がある。(次回説明) Linuxでは拡張子は.so、windowsでは.dll リンク時ではなく、プログラム実行時にメモリー上にロードされる。これにより、実行形式ファイルのサイズが小さくなる。

ヘッダーファイル ヘッダーファイル ライブラリ関数の型の宣言等が記述されているファイル。プリプロセス時に読み込む。 Cの場合 stdio.h (標準入出力ヘッダー) stdlib.h (標準ライブラリヘッダー) math.h (算術関数用ヘッダー) /usr/include, その下のサブディレクトリ -I(エルの小文字ではなく、アイの大文字)オプションでヘッダーファイル検索ディレクトリを追加指定できる。

分割コンパイル C言語プログラムを一つのファイルに全部書くのではなく、複数のファイルに分けて記述する。 それぞれのCファイルは個別にコンパイルできる(分割コンパイル)。.oファイルが生成される。 $ gcc –c test.c などを実行すると、test.oというファイルが生成される。 再配置可能なコードが生成される。リンク時に解決。 一つのファイルを修正した場合、他のファイルのコンパイルをやり直さなくてよいので、修正時のコンパイル時間が短縮される。(ただし、リンクのやり直しは必要)

分割コンパイルによるコンパイル手順(例) 2つのdouble型の足し算を行う関数addを定義したC言語ファイルadd.cを作成し、分割コンパイル(add.oが生成される) $ gcc -c add.c ヘッダファイルの作成 関数addのプロトタイプ宣言 double add (double, double); を記述したファイルadd.hを作成 add関数を呼び出すmain関数を記述したC言語ファイルmain.cを作成 add.hをインクルード (#include “add.h” をファイルの先頭に記述) gcc -c main.c リンクし、実行形式ファイルをmainというファイル名で作成 ・  gcc -o main main.o add.o

演習課題 2つのdouble型の足し算をする関数addを定義したCファイルadd.cを作成 add関数のプロトタイプ宣言をadd.hに作成 add (3.0,4.0) のような計算を行って結果を表示するmain関数をmain.cに記述 さきほどの手順で、分割コンパイルをし、リンクして実行形式ファイルmainを作成 mainを実行

ライブラリの作成 ライブラリ化したい関数を記述したソースファイルを作成。(add.c, mult.cなど) アーカイバ ar でアーカイブを作成 関数のプロトタイプ宣言を記述したヘッダーファイルを作成

ライブラリ(アーカイブ)作成手順(例) 複数のオブジェクトファイルをアーカイバ ar を用いて一つのファイルにまとめる。(ar はオブジェクトファイルに限らず使えるが、普通はライブラリ作成に用いる。) add.o, mult.o からアーカイブ libaddmult.a を作成 ar crv libaddmult.a add.o mult.o addとmultのプロトタイプ宣言をaddmult.hに作成 リンク $ gcc -L. main.o -laddmult あるいは $ gcc –L. main.c –laddmult でもよい。 あるいは $ gcc main.c libaddmult.a でもよい。 (実行ファイルをa.out以外にする場合は-oオプションで指定) (参考)ライブラリや実行可能プログラムに含まれる関数を調べるコマンド(nm)が使える。

演習課題 2つのdouble型の足し算をする関数addと掛け算をする関数multをadd.c, mult.cに作成 add.o, mult.oをarでまとめてlibaddmult.aを作成  mult (add (3.0,4.0), 3.0)のような計算を行って結果を表示するmain関数をmain.cに記述 main.cを分割コンパイル 前ページの手順でリンクして実行