情報工学科 3年生対象 専門科目 システムプログラミング 第1回 導入 第2回 Linux、分割コンパイル 情報工学科 篠埜 功 講義計画 OSの授業で学んだことをプログラミングを通し て体験することを目的とする。 • スクリプト言語を用いたプログラミング • システムコールを使ったプログラム作成 – ファイル操作 – プロセス – シグナル – プロセス間通信 • 簡易なweb serverを作成する 参考書 C言語によるUNIXシステムプログラミング入門,河野 清尊 著,オーム社 ¥2940(税込) 成績評価 • レポート課題(50%) • 期末試験(50%) 連絡先 • 篠埜 功 居室: 豊洲校舎 14階 14K32 E-mail: [email protected] 講義用ページ: http://www.sic.shibaurait.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 ・・・・・・・・・・・ ・・・・・・・・・・・ ・・・・・・・・・・・ fscanf() ・・・・・・・・・・・ ・・・・・・・・・・・ Data File システムコール 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 – 改変等は自由だが、改変後の配布時にソースコードを開 示しなければならない。 (参考) BSD license (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 2. ヘッダファイルの作成 – 関数addのプロトタイプ宣言 double add (double, double); を記述したファイルadd.hを作成 3. add関数を呼び出すmain関数を記述したC言語ファイルmain.c を作成 – add.hをインクルード (#include “add.h” をファイルの先頭に 記述) – gcc -c main.c – リンクし、実行形式ファイルをmainというファイル名で作成 ・ gcc -o main main.o add.o 1. 演習課題 • 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に記述 • main.cを分割コンパイル • 前ページの手順でリンクして実行
© Copyright 2024 ExpyDoc