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

■連絡事項

2022/04/18
4月20日(水曜日)3時間目(12:15-)から説明会を開催します。 3C206 の aloe94 の近くに集まって下さい。 大学に来れない人は、 Microsoft Teams のチーム 「GB36403_情報システム実験A_K-3_システムプログラム_2022」 を開いていてください。 そこで開かれる「会議」に参加して下さい。
2022/04/21
Manaba のコースは xx20199 情報システム実験A K-3 システムプログラム です。レポート提出に使います。
2022/04/21
Microsoft Teams のチームは 「 GB36403_情報システム実験A_K-3_システムプログラム_2022 」 です。 説明会、質疑応答に使います。 教員が受講生をチームに登録します。

■出席(実験)

授業時間中に次のボタンを押しなさい。
次のボタンで、過去の出席が確認ができます。

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

■注意事項

■レポート締切

後ほど示します。 レポートは、レポート作成上の注意を良く読み、レポートのPDFファイルをmanabaの該当コースに提出しなさい。

■課題1: 端末操作

◆課題1-1 補講

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

◆課題1-2 straceコマンド

Linux の strace コマンドについて調査しなさい。 次のようなコマンドを実行しなさい。 これらのコマンドで利用されているシステム・コールは、次の2種類に分類される。 実行したコマンドがシステム・コールのうち、後者のものを列挙しなさい。列 挙したシステム・コールについて、簡単に説明しなさい。

◆課題1-3 ltraceコマンド

Linux の ltrace コマンドについて調査しなさい。 課題1-2と同じコマンドを実行し、どのようなライブラリ関数を利用しているか 調査しなさい。これらのライブラリ関数について、 関連するシステム・コールを示しなさい。

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

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

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

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

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

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

(1) cat コマンド

例:% cat file1 file2 file3 > file4
例:% cat -n file1

(2) cp コマンド

例:% cp file1 file2
例:% cp file1 file2 file3 dir1

(3) sort コマンド

例:% sort file1 > file1.sorted

(4) uniq コマンド

例:% uniq file1

(5) head コマンド

例:% head file1 file2
例:% head -5 file1

(6) tail コマンド

例:% tail file1 file2
例:% tail -5 file1

(7) cmp コマンド

例:% cmp file1 file2
file1 file2 differ: char 584,line 25

(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

グループB: ディレクトリ、時刻、ユーザID、その他

(11) ls コマンド

例:% ls
例:% ls dir
例:% ls file1 file2
例:% ls -l dir

(12) find コマンド

例:% find . -name file1 -print

(13) tar コマンド

例:% tar cf - file1 file2 > files.tar
例:% tar cf - dir | gzip > dir.tar.gz
例:% tar tf dir.tar
例:% tar xf dir.tar

(14) date コマンド

例:% date
例:% env TZ=UTC date

(15) sleep コマンド

例:% sleep 10
例:% sleep 5; echo "wake up"

(16) whoami コマンド

例:% whoami

(17) id コマンド

例:% id
例:% id loginname

(18) bc コマンド

例:% bc
10+20
30
2^16
65536
10+20*30
610
^D
% 

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

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

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

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

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

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

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

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

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

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

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

◆課題3a-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 とは異なっても良い。 少なくとも次のような項目を含めなさい。 これ以外の項目を含んでも良い。

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

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

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

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

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

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

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

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

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

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

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

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

◆課題3b-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プロトコル用のバッファサイズに起因している.この点に注意をしてこ れらのシステムコールを使うこと.

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

■課題3c: シェルの作成

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

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

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

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

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

◆課題3c-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 等の項目を調べよ.

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

課題3c-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 上のシェルが持っていないような新しい機能

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

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

■レポート作成上の注意

◆プログラムの仕様

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

◆開発環境

◆実行結果

◆感想、参考文献

◆提出物


Last updated: 2022/04/21 18:32:36
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>