担当教員
いずれも、
coins
のユーザ名とパスワードが必要です。ユーザ名とパスワード
を打つ時には、SSL が有効になっていることを確認してください。また、URL
が https://idp.coins.tsukuba.ac.jp/
で始まっ
ていることを目で確認して下さい。
課題1のプログラムはC言語を用いて作成しなさい。
以下に記述されたコマンドの利用方法のうち、グループAから4個、グループBか ら2個以上選び、マニュアルを読み、実際に実行してコマンドの働きを調べなさい。 この時、例に記述された利用方法を全て実行してみなさい。たとえば、引数と して複数のファイルが指定できる場合やディレクトリ名を指定できる場合はそ のような例を実行してみなさい。また、例に示されたオプションを利用してみ なさい。
(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
(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 %
作成したコマンドが持っている外部仕様(機能と制限事項)について,報告書に 明確に記述しなさい.当然のことながら,多くの機能があり,制限がないこと が望ましい.作成した機能を説明するために,十分な実行例を添付しなさい. UNIX上の既存のコマンドと実験で作成したコマンドの出力を比較しなさい.
この課題では,UNIX 上で動作する簡単なシェル(コマンド・インタプリタ)を作成する. この実験の目的は,簡単なシェルの作成を通じて,プロセスの生成,入出力の切替え,パイプの動作について深く理解することである. (注意: この課題は、C 言語でシェルを作成するものである。シェルスクリプトを作成するものではない。)
この課題2に関する補足説明を参考にしても良い.
課題2のプログラムはC言語を用いて作成しなさい。
UNIX では,さまざまなシェルが利用可能になっている.例えば,sh, csh, tcsh, bash, ksh, zsh 等がある. これらのシェルが持っている機能と,それらの機能がどのようにして実現されているかを調べなさい. 特に,コマンドの実行方法,パイプラインの作成方法(パイプラインに属しているプロセスの親子関係)について,調査しなさい. そして,何を調べたか,調査の結果とその方法を報告しなさい.
次の機能を持つシェルを作成しなさい.以下に示す例は,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 等の項目を調べよ.
(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 上のシェルが持っていないような新しい機能
作成したシェルが持っている外部仕様(機能と制限事項)について,レポートに明確に記述しなさい. 当然のことながら,多くの機能があり制限がないことが望ましい. 作成した機能を説明するために,十分な実行例を添付しなさい. 複数の機能の組み合わせについても同様である. 作成したシェルを,UNIX 上の既存のシェルと比較しなさい. 特に,パイプラインの作成方法について比較しなさい.
ネットワークプログラミングの理解を深めることを目的として,Unixのソケッ ト API を用いて対話的にファイル転送を行うためのサーバ・プログラム、お よび、クライアント・プログラムを作成する。サーバ・プログラムを、mftpd (mini ftp daemon)、クライアントを mftp (mini ftp) と呼ぶ。
レポートには、クライアント、および、サーバがどのような通信を行うのかを 明確に記述しなさい。たとえば、次のように記述する方法が考えられる。
バイト・オーダが違うコンピュータであっても転送できるようにしなさい。デー タとして0を含むようなバイナリ・ファイルも転送できるようにしなさい。
コマンドやデータ区切りを保つには、次のような方法が考えられる。
クライアントとサーバが異なるプログラミング言語で記述されていたとしても 動作するようにプロトコルを設計しなさい。なお、実際に記述する必要はない。
サーバ・プログラム mftpd は、次のようにして実行する。
% mftpd portno引数として、ポート番号を取る。必要に応じて時引数を追加してもよい.
ポート番号としては,1024 以上で、他の実験者との衝突を避けるために,引 数で与えられるようにしておくとよい.ただし、サーバは終了しないので、自 分自身のプログラムと衝突させて、多数の mftpd を実行しないように注意し なさい。特定のポート番号は、一定時間利用できなくなることがあるので、2、 3個のポート番号を順に使うとよい。
クライアント・プログラム mftp は、次のようにして実行する。
% mftp host portno引数として、サーバが動作しているホストのホスト名とポート番号を取る。必 要に応じて引数を追加してもよい.
mftpは少なくとも次のような対話コマンドをサポートすること.
この課題では、ネットワークプロトコルとしてTCP/IPを用いなさい。また、通 常の Socket API 、または、それと類似のレベルの API を用いること。
TCPプロトコルのソケットに対してreadおよびwriteシステムコールを実行する と,通常のディスクファイルに対する入出力と異なり,指定したバイト数より も少ないバイト数しか入出力が行なわれないことがある.これはOSカーネル内 のTCPプロトコル用のバッファサイズに起因している.この点に注意をしてこ れらのシステムコールを使うこと.
プログラムの入力と,その入力に対する動作および出力を過不足なく述べること.
自分で設定した拡張や制約に関しても述べること.
アルゴリズム,方式,内部動作の説明 プログラム中で使用しているアルゴリズムや方式の採用理由とその内容を分かりやすく説明すること.
ネットワークプログラミングの場合は,クライアントプロセスとサーバプロセスの間のプロトコル(両プロセスでどういう場合にどういうメッセージやデータがやりとりされるか)を記載すること.
必要に応じて図を用いること.
プログラムの中に書き込むのではなく,独立したページに記述すること.
プログラム開発に使用したプログラミング言語,言語処理系,オペレーティングシステム,計算機機種,ライブラリ等を記載すること.
作成したプログラムを記載すること.
実行環境(少なくとも計算機機種名,オペレーティングシステム名)),および,実行結果を記載すること.
実行結果は,プログラムがきちんと動作していることを示すために必要かつ十分なものになるようにすること.
実行結果の入力部と出力部がはっきりとわかるように工夫すること.
実行例を考える際には,どういう例を付せば,実現すべき機能が動作していることを示せるかをよく考えること.
実行例をわかりやすくるすためには,プログラムの仕様作成の際に,どういう入出力をすると効果的かを配慮しておくとよい.
実行結果が付されていない機能に関しては,実現されなかったものとみなす.
プログラミングおよびレポート作成の際に参考にした参考文献を記載すること.
プログラムの作成に要した時間,および,本レポートの作成に要した時間を記載すること.プログラムモジュールごとの開発時間を記載してもよい. プログラミングおよびレポート作成の際の感想を記載すること.
レポートはPDFファイル形式で作成しなさい。