[概要][詳細][実験トップ]
担当教員
新城 靖 <yas@cs.tsukuba.ac.jp>
実施学期
春ABC
実験の概要
この実験では、 同じ名前の講義 システムプログラム と関連して、次の課題から3つ以上選択し、取り組む。 この実験課題を選択した人は、必ず講義も受講すること。 (実験の課題と講義の課題は一部重なりがある。)

■連絡事項

2024/04/22
4月24日(水曜日)3時間目(12:15-)から説明会を開催します。 3C205 の 3C205-30 の近くに集まって下さい。
2024/04/22
Manaba のコースは xx20199 情報システム実験A K-3 システムプログラム です。レポート提出に使います。
2024/04/22
実験では、自分 PC、AC アダプタ、HDMI で外付けディスプレイに接続するための機器を持ってきて下さい。 自分の PC では、リモートデスクトップのクライアントか、ssh のクライアントが動けば十分です。 プログラムの作成は、情報科学類で用意しているサーバに接続して行います。

■出席(実験)

実習室に来て着席した時に「出席」、退席する時に「退席」ボタンを押しなさい。 「一覧」で、過去の出席が確認ができます。

いずれも、coins のユーザ名とパスワードが必要です。ユーザ名とパスワード を打つ時には、SSL が有効になっていることを確認してください。また、URL が https://idp.coins.tsukuba.ac.jp/で始まっ ていることを目で確認して下さい。

■注意事項

■課題A: 端末操作

◆課題A-1 補講

システムプログラム(講義)の補講(第-1回,第0回) の課題を、加点課題も含めて行いなさい。

◆課題A-2 straceコマンド

Linux の strace コマンドを使って、システム・コールについて調査しなさい。 次のようなコマンドを実行しなさい。
  1. 自分で作成した何もしない C 言語のプログラム。
  2. 自分で作成した何もしない C 言語のプログラム。 コンパイル時に -static を付けて、静的リンクをしたもの。
  3. 自分で作成した Hello, world と表示する C 言語のプログラム。
  4. 自分で作成した Hello, world と表示する C 言語のプログラム。 コンパイル時に -static を付けて、静的リンクをしたもの。
  5. cat /etc/shells
  6. cat < /etc/shells
これらのコマンドで利用されているシステム・コールは、次の3種類に分類される。 上記のコマンド 1. と 2. を比較しなさい。 Type 1 のシステム・コールを1つ選び、説明しなさい。 Type 2 のシステム・コールを1つ選び、説明しなさい。

上記のコマンド 1. と 3, または 2. と 4 を比較しなさい。 Type 3 のシステム・コールを1つ選び、説明しなさい。

上記のコマンド 5. で使われたシステム・コールのうち、Type 3 のものを列挙しなさい。 これらのシステム・コールについて、 その引数、結果、意味を man コマンド等で調査しなさい。 上記のコマンド 5. でどのような引数で呼び出されたのか説明しなさい。

上記のコマンド 5. と 6. を比較し、 使われているシステム・コールの観点から違いを述べなさい。

◆課題A-3 ltraceコマンド

Linux の ltrace コマンドについて調査しなさい。 課題A-2と同じコマンドを実行し、main() 関数やそれから呼び出される関数で使われるも のを 列挙しなさい。 これらのライブラリ関数について、 関連するシステム・コールを示しなさい。

◆課題A-4 lsコマンド

ls コマンドのマニュアルを読みなさい。

次のオプションの動作を確認しなさい。

-a, -c, -d, -i, -l, -L, -R, -t

ls -l コマンドを使って、既に開発環境のシステムに存在する、次のようなファ イルの例を表示しなさい。

◆課題A-5 ジョブ制御

端末でジョブ制御が行いなさい。次のような操作を行いなさい。 2つのディレクトリと、その中に4つのファイルを作成しなさい。

次のようなシンボリック・リンクを作成しなさい。

レポートには、シンボリック・リンクを作成したコマンドとその内容を確認す るコマンドを実行した端末の表示を含めなさい。

通常のパス名とシンボリック・リンクを使ったパス名を用いて同じファイルを 複数の名前で扱えることを、ls コマンドやcat コマンドを使って示しなさい。

■課題B: UNIXコマンドの作成

この課題では、UNIXでシェルから利用されるコマンドと類似のコマンドを作成 する。この課題の目的は、コマンドの作成を通じて、ファイルとシステム・コー ルについて深く知ることである。

この課題のプログラムはC言語を用いて作成しなさい。

◆課題B-1 UNIX上の既存のコマンドの調査

以下に記述されたコマンドの利用方法のうち、 各グループ2個以上選び、マニュアルを読み、実際に実行してコマンドの働きを調べなさい。 この時、例に記述された利用方法を全て実行してみなさい。たとえば、引数と して複数のファイルが指定できる場合やディレクトリ名を指定できる場合はそ のような例を実行してみなさい。また、例に示されたオプションを利用してみ なさい。

グループA: ファイル関連

(1) cat コマンド

$ cat file1 - file2 > file3 [←]
$ cat -n file1 [←]
$ cat -n file1 - file2 > file3 [←]

(2) cp コマンド

$ cp file1 file2 [←]
$ cp file1 file2 file3 dir1 [←]

(3) sort コマンド

$ sort file1 > file1.sorted [←]

(4) uniq コマンド

$ uniq file1 [←]
$ sort file1 > file1.sorted [←]
$ sort file1 | uniq [←]

(5) head コマンド

$ head file1 file2 [←]
$ head file1 - file2 [←]
$ head -5 file1 [←]

(6) tail コマンド

$ tail file1 file2 [←]
$ tail file1 - file2 [←]
$ tail -5 file1 [←]

(7) cmp コマンド

$ cmp file1 file2 [←]
$ cmp file1 - [←]

(8) tr コマンド

$ tr A-Z a-z < file1 > file2 [←]

(9) wc コマンド

$ wc file1 file2 [←]
         18      25     283 file1
         62     216    1658 file2
         80     241    1941 total
$ []

(10) grep コマンド

$ grep pattern file [←]

(11) who コマンド

$ who [←]

グループB: ディレクトリ

(12) ls コマンド

$ ls [←]
$ ls dir [←]
$ ls file1 file2 [←]
$ ls -l dir [←]

(13) mkdir コマンド

$ mkdir dir1 [←]
$ mkdir -p dir2/dir3 [←]

(14) du コマンド

$ du [←]
$ du ~/public_html/ [←]

(15) df コマンド

$ df . [←]

(16) sync コマンド

$ sync [←]

(17) find コマンド

$ find . -name file1 -print [←]

(18) tar コマンド

$ tar cf - file1 file2 > files.tar [←]
$ tar cf - dir | gzip > dir.tar.gz [←]
$ tar tf dir.tar [←]
$ tar xf dir.tar [←]

グループC: 時刻と時間

(19) date コマンド

$ date [←]
$ env TZ=UTC date [←]

(20) sleep コマンド

$ sleep 10 [←]
$ sleep 5; echo "wake up" [←]

(21) touch コマンド

$ ls -l file [←]
$ touch file [←]
$ ls -l file [←]

(22) stat コマンド

$ stat file [←]
$ stat . [←]

グループD: UID

(23) whoami コマンド

$ whoami [←]

(24) id コマンド

$ id [←]
$ id loginname [←]

(25) groups コマンド

$ groups [←]

(26) su コマンド

$ su [←]

(27) sudo コマンド

$ sudo shutdown now [←]

グループE: プロセス

(28) time コマンド

$ time ./a.out [←]

(29) true コマンド

$ if   true; then echo OK $?; else echo NG $?; fi; [←]
$ if ! true; then echo OK $?; else echo NG $?; fi; [←]

(30) kill コマンド

$ kill PID [←]
$ kill -9 PID [←]

(31) watch コマンド

$ watch who [←]

(32) xargs コマンド

$ find . -name '*.[ch]' -newer a.out -print | xargs head [←]
$ file /usr/bin/* | awk -F: '/shell script/ {print $1}' | xargs wc [←]

(33) timeout コマンド

$ sh -c 'echo What is your name\?; read name; echo Hello, $name-san.' [←]
$ timeout 5 sh -c 'echo What is your name\?; read name; echo Hello, $name-san.' [←]

(34) nohup コマンド

$ nohup make > log 2>&1 & [←]

◆課題B-2 UNIX上の既存のコマンドと類似のコマンドの作成

課題B-1で調査したコマンドのうち、各グループ1つ以上を選択して、UNIXのコ マンドと類似のコマンドを作成しなさい。 この時、例に記述された利用方法が全て利用できるようにしなさい。たとえば、 引数として複数のファイルが指定できる場合やディレクトリ名を指定できる場 合はそのように実装しなさい。また、例に示されたオプションを全て実装しな さい。 例に指定されていないオプションは、実装しなくても良い。

◆課題Bに関するレポート作成上の注意

作成したコマンドが持っている外部仕様(機能と制限事項)について,報告書に 明確に記述しなさい.当然のことながら,多くの機能があり,制限がないこと が望ましい.作成した機能を説明するために,十分な実行例を添付しなさい. UNIX上の既存のコマンドと実験で作成したコマンドの出力を比較しなさい.

■課題C: シェルの作成

この課題では,UNIX 上で動作する簡単なシェル(コマンド・インタプリタ)を作成する. この実験の目的は,簡単なシェルの作成を通じて,プロセスの生成,入出力の切替え,パイプの動作について深く理解することである. (注意: この課題は、C 言語でシェルを作成するものである。シェルスクリプトを作成するものではない。)

この課題3に関する補足説明を参考にしても良い.

課題CのプログラムはC言語を用いて作成しなさい。

◆課題C-1 UNIX 上の既存のシェルの調査

UNIX では,さまざまなシェルが利用可能になっている.例えば,sh, csh, tcsh, bash, ksh, zsh 等がある. これらのシェルが持っている機能と,それらの機能がどのようにして実現されているかを調べなさい. 特に,コマンドの実行方法,パイプラインの作成方法(パイプラインに属しているプロセスの親子関係)について,調査しなさい. そして,何を調べたか,調査の結果とその方法を報告しなさい.

◆課題C-2 シェルの基本機能の作成

次の機能を持つシェルを作成しなさい.以下に示す例は,UNIX の csh (tcsh) の文法と機能に基づいている.

(1) 単一コマンドの実行

例:% ls

(2) 標準入出力の切替え

例:% wc < data > result

(3) 複数コマンドからなるパイプラインの実行

例:% cat data1 data2 | sort +1 -2 | uniq

(4) 上記(1)〜(3)の組み合わせ

例:% cat data1 data2 | sort +1 -2 > result

(5) 終了コマンド(csh では,exit)を実行するとシェルは終了するものとする.しかし,^C, ^\ といったキーボードからの割込みに起因するシグナルによって,シェル自身が終了してはならない.シェルから起動したコマンドは,これらのシグナルにより終了するものとする.シグナルについてマニュアルの signal 等の項目を調べよ.

◆課題C-3 シェルの拡張機能の作成

課題C-2の機能に加えて,下記の機能から1つ以上を選択して実装しなさい.

(6) 標準エラー出力の切替え

例:% make |& tee log

(7) 標準出力,標準エラー出力における追加モード

例:% cat data1 | sort >> result

(8) 子シェル(コマンド・グループ)の実行

例:% (cat data1 data2 | sort > result) >& error

(9) バックグランド実行

例:% egrep pattern data | wc &

(10) 条件実行

例:% egrep pattern data > result && less -F -N -S result
例:% cc test.c >& err || echo 'Compilation failed'

(11) cd, time, pushd, popd などの内部コマンドの提供

例:% cd /

(12) ジョブ制御(フォアグランド,バックグランドの切替え)

(13) その他,UNIX 上のシェルが持っている機能

(14) UNIX 上のシェルが持っていないような新しい機能

◆課題Cに関するレポート作成上の注意

作成したシェルが持っている外部仕様(機能と制限事項)について,レポートに明確に記述しなさい. 当然のことながら,多くの機能があり制限がないことが望ましい. 作成した機能を説明するために,十分な実行例を添付しなさい. 複数の機能の組み合わせについても同様である. 作成したシェルを,UNIX 上の既存のシェルと比較しなさい. 特に,パイプラインの作成方法について比較しなさい.

■課題D: 簡易FTPサーバ、および、クライアントの作成

ネットワークプログラミングの理解を深めることを目的として,Unixのソケッ ト API を用いて対話的にファイル転送を行うためのサーバ・プログラム、お よび、クライアント・プログラムを作成する。サーバ・プログラムを、mftpd (mini ftp daemon)、クライアントを mftp (mini ftp) と呼ぶ。

◆課題D-1 プロトコルの設計

クライアントとサーバの間でどのような形式でコマンドやデータをやり取りす るかのプロトコルを設計しなさい。少なくとも次のような機能を実現する必要 がある。 実際の ftp では、コマンドとデータを別々の TCP/IP のストリームで転送し ている。この課題で作成する mini-ftp では、その必要はない。

レポートには、クライアント、および、サーバがどのような通信を行うのかを 明確に記述しなさい。たとえば、次のように記述する方法が考えられる。

  1. クライアント→サーバ: "get ファイル名\n"
    「ファイル名」は、空白や改行を含まない文字列。
  2. サーバ→クライアント: "ok サイズ\n" ファイルのデータ
    「サイズ」は、ファイルのバイト数を10進数で表記したもの。

バイト・オーダが違うコンピュータであっても転送できるようにしなさい。デー タとして0を含むようなバイナリ・ファイルも転送できるようにしなさい。

コマンドやデータ区切りを保つには、次のような方法が考えられる。

クライアントとサーバが異なるプログラミング言語で記述されていたとしても 動作するようにプロトコルを設計しなさい。なお、実際に記述する必要はない。

◆課題D-2 クライアントとサーバの作成

サーバ・プログラム mftpd は、次のようにして実行する。

% mftpd portno
引数として、ポート番号を取る。必要に応じて時引数を追加してもよい.

ポート番号としては,1024 以上で、他の実験者との衝突を避けるために,引 数で与えられるようにしておくとよい.ただし、サーバは終了しないので、自 分自身のプログラムと衝突させて、多数の mftpd を実行しないように注意し なさい。特定のポート番号は、一定時間利用できなくなることがあるので、2、 3個のポート番号を順に使うとよい。

クライアント・プログラム mftp は、次のようにして実行する。

% mftp host portno
引数として、サーバが動作しているホストのホスト名とポート番号を取る。必 要に応じて引数を追加してもよい.

mftpは少なくとも次のような対話コマンドをサポートすること.

get file
コマンド引数 fileで指定したファイルをクライアントサイト側にコピーする.
put file
コマンド引数fileで指定したファイルをサーバサイト側にコピーする.
dir
サーバサイト側のディレクトリ情報を表示する.
上記以外に例えば下記のような対話コマンドを実行できるようにしてもよい.
help
使用可能な対話コマンドとその簡単な説明を表示する.
cd dir
サーバサイト側で,dirで指定したディレクトリに作業ディレクト リを変更する.
lcd dir
クライアントサイト側で,dirで指定したディレクトリに作業ディレクトリを変更する.
put, get の拡張(1)
転送を途中で一時的に中断する。中断した転送を再開する。
put, get の拡張(2)
複数ファイルを同時に転送する。一つのファイルを分割して同時に転送する。
その他の機能としては、実際の ftp コマンドや ftpd コマンドを参考にする とよい.

この課題では、ネットワークプロトコルとしてTCP/IPを用いなさい。また、通 常の Socket API 、または、それと類似のレベルの API を用いること。

TCPプロトコルのソケットに対してreadおよびwriteシステムコールを実行する と,通常のディスクファイルに対する入出力と異なり,指定したバイト数より も少ないバイト数しか入出力が行なわれないことがある.これはOSカーネル内 のTCPプロトコル用のバッファサイズに起因している.この点に注意をしてこ れらのシステムコールを使うこと.

◆課題Dに関するレポート作成上の注意

■課題E: CGI 可能な Web サーバの作成

この課題では,CGI が実行可能な Web サーバを作成する。 この実験の目的は,Web サーバに対して CGI を実行する機能を付加することで、 プロセスの生成,入出力の切替え,パイプの動作について深く理解することである. (注意: この課題は、C 言語で Web サーバを作成するものである。 既存の Web サーバで動作する CGI プログラムを作成するものではない。)

この課題のプログラムはC言語を用いて作成しなさい。

◆課題E-1 Apache Web サーバの調査

Coins では、Web サーバとして Apache httpd サーバが動作している。次のことを行い、Web サーバの動作を確認しなさい。

CGI のプログラムが動作する権限(UID) を調査しなさい。

レポートには、上記のことを実行した時のアクセスログを含めなさい。

◆課題E-2 Web サーバ

テキスト、および、バイナリファイルが扱える Web サーバを作成しなさい。 て次のような拡張子を持つファイルを扱えるようにしなさい。 この表にないものを加えても良い。
Content-Type: 拡張子
text/html .html
text/plain .txt
text/plain .text
image/gif .gif
image/jpeg .jpeg
image/png .png
実際の Web ブラウザ (Firefoxなど)で、動作を確認しなさい。telnet だけで は、きちんと HTTP のプロトコルに従っているか確認できないので、不十分で ある。

複数のクライアントから同時に接続を受けるようにしなさい。 この課題では、クライアントごとに fork() システム・コールでプロセスを生 成する方法を使いなさい。 Apache httpd prefork と同様に、 事前に fork() したプロセスのプールを利用する方法を用いてもよい。 同時に扱えるクライアントの最大数を設定できるようにしなさい。た とえば最大2と設定した場合、2つの接続まで同時に処理を行うが、3つ目が 来た場合、接続を切るか他の接続が閉じられるまで処理を遅延する。

子プロセスが終了したら直ちにゾンビを回収することが好ましい。 子プロセスの終了を、シグナルSIGCHLD で知る方法もある。複数の子プロセスが終了しても、シグナルは1回 しか送られないことがあることに注意しなさい。

上限を設定する目的は、攻撃等でサーバの CPU 時間が奪われることやプ ロセスが増えすぎることを防ぐことにある。プロセスの終了を busy wait で待っ てはならない。待つならば、accept() や wait() のように、CPU 時間を消費し ない形で待つようにしなさい。

レポートには、ps コマンドの結果やアクセスログを含めて 複数のクライアントからの要求を同時に処理していることを示しなさい。 複数接続できることを確認するには、telnet のように遅いクライアントを用い る方法がある。単に Web ブラウザで複数のページを開けても、通信そのものは 短時間で終わるので、複数接続できることの確認にはならない。

クライアントが不正な要求を送ってきたとしても、 エラーを返すなどして、サーバの実行を継続すること。 サーバが終了してしまうと、DoS 攻撃(Denial-of-service attack)が簡単に成功することを意味する。

Apache httpd のアクセスログと同様に、アクセスログを保存を保存しなさい。 1 回の HTTP によるアクセスについて、1行のログを作成しなさい。 ログの形式は、Apache httpd とは異なっても良い。 少なくとも次のような項目を含めなさい。 これ以外の項目を含んでも良い。

◆課題E-3 CGI が実行可能なWeb サーバ

課題E-2 の Web サーバを拡張し、CGI により外部のプログラムを実行するこ とができるようにしなさい。拡張子が .cgi のプログラムを CGI と見 なし、プログラムを実行し、その結果をクライアントに返しなさい。

CGI プログラムが不正な結果を返した場合でも、Apache httpd と同様に クライアントには適切な HTTP に基づく応答を返しなさい。 CGI プログラムが標準エラー出力に出力した結果は、エラーログに保存しなさい。

■レポート作成上の注意

◆プログラムの仕様

◆データ構造とアルゴリズム、プロトコル

◆開発環境

◆実行結果

◆感想、参考文献

◆提出物


Last updated: 2024/04/22 11:33:47
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>