360 likes | 496 Views
情報工学科 3 年生対象 専門科目. システムプログラミング. 第 1 回 導入 第2回 Linux 、分割コンパイル. 情報工学科 篠埜 功. 講義計画. OS の授業で学んだことをプログラミングを通して体験することを目的とする。 スクリプト言語を用いたプログラミング システムコールを使ったプログラム作成 ファイル操作 プロセス シグナル プロセス間通信 簡易な web server を作成する. 参考書. C 言語による UNIX システムプログラミング入門,河野清尊 著,オーム社 ¥2940 (税込). 成績評価. レポート課題( 50% )
E N D
情報工学科 3年生対象 専門科目 システムプログラミング 第1回 導入 第2回 Linux、分割コンパイル 情報工学科 篠埜 功
講義計画 OSの授業で学んだことをプログラミングを通して体験することを目的とする。 • スクリプト言語を用いたプログラミング • システムコールを使ったプログラム作成 • ファイル操作 • プロセス • シグナル • プロセス間通信 • 簡易なweb serverを作成する
参考書 C言語によるUNIXシステムプログラミング入門,河野清尊著,オーム社 ¥2940(税込)
成績評価 • レポート課題(50%) • 期末試験(50%)
連絡先 • 篠埜 功 居室: 豊洲校舎 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 ソースコードが公開されている ソースコードが非公開 ※情報工学科ではLinuxなどのUnix系OSに触れておくのは必須。
学習目標 • オペレーティングシステムが提供するシステムコールを用いるプログラムが書けるようになる。 • ネットワーク、ファイル操作等 ・プログラミングの自由度を広げる。 ・よりOSに近いレベルのプログラム開発を通してOSの機能に対する理解度を深める。
ソフトウェア カーネル(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は、マウスなどのポインティングデバイスを用いるので操作に時間がかかる。 • CLIは、キーボード操作に慣れれば、操作が速い。 • (例)短い内容のテキストファイル(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 • 改変等は自由だが、改変後の配布時にソースコードを開示しなければならない。 (参考) BSDlicense (Berkeley Software Distribution License)はcopyleftではない。OSではFreeBSDなど、OS以外ではPostgreSQLなどがBSD license。BSDをベースにしたライセンス(BSD style lisence)ではApache、Python等。
Copyrightと Copyleft • 使用許諾契約書 • 通常の商用ソフトウェアは,ソフトウェアの使用に関しての制限を設ける • Copyleft • フリーソフトウェアの使用に関して他者が制限を設けることを禁じる GPLに従って配布されているソフトウェアの例 gcc: Cコンパイラ emacs: テキストディタ
C言語プログラミング(参考書1.2節) • Cコンパイラ(gcc)の使い方 • Cコンパイラの処理の流れ(詳細) • 静的リンクと動的リンク
gcc(GNU C Compiler)の使い方(参考書1.2.2節) $ gcc オプション ファイル名 ($ 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.c, mult.cを分割コンパイル • add.o, mult.oをarでまとめてlibaddmult.aを作成 • mult (add (3.0,4.0), 3.0)のような計算を行って結果を表示するmain関数をmain.cに記述 • リンクして実行