[概要][詳細][実験トップ]

情報システム実験:システムプログラム

担当教員

この実験では、次の課題を行う。 この実験は、同じ名前の講義、「システムプログラム」と深く関連している。 この実験テーマを選択する時には、講義も合わせて受講しなさい。

連絡事項

4月21日(金)5時間目(15:15-)から説明を行います。 3C113 の borage37 の近くに集まって下さい。

注意事項

レポート締切

レポートは、レポート作成上の注意を良く読み、3C113に設置されるレポート提出箱に提出しなさい。

課題1 UNIXコマンドの作成

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

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

課題1-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
% 

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

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

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

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

課題2 シェルの作成

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

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

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

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

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

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

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

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

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

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

課題3A 簡易FTP

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

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

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

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

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

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

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

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

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

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

課題3B 簡易ウインドウ・システム

ネットワークプログラミングの理解を深めることを目的として,クライアント・ サーバ・モデルに基づく簡単なウインドウ・システムを作成する。

四角、三角、丸、直線が書かれたウインドウ

この課題では、サーバは、既存の X Window、Java、または、その他の既存の ウインドウ・システムの機能を用いて画面を表示する。クライアント側は、 サーバに対して TCP/IP により要求を送る。

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

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

ウインドウを表示するプログラムについては、次のプログラムを参考にしてもよい。

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

クライアントとサーバの間でどのような形式でコマンドやデータをやり取りす るかのプロトコルを設計しなさい。少なくとも次のような機能を実現する必要 がある。 レポートには、クライアント、および、サーバがどのような通信を行うのかを 明確に記述しなさい。たとえば、次のように記述する方法が考えられる。
  1. クライアント→サーバ: "box x座標 y座標 x幅 y高さ 色\n"
    「x座標」は、整数を10進数で表記したもの。...
  2. サーバ→クライアント: "ok\n"
クライアントとサーバが異なるプログラミング言語で記述されていたとしても 動作するようにプロトコルを設計しなさい。なお、実際に記述する必要はない。

課題3B-2 ウインドウ・システムの基本機能

課題3B-1に示したプロトコルを用いて、ウインドウ・システムのクライアント、 および、サーバを作成しなさい。

課題3B-3 ウインドウ・システムの拡張機能

下記の機能から1つ以上を選択して実装しなさい.

レポート作成上の注意

プログラムの仕様

開発環境

実行結果

参考文献,感想

とじかた


Last updated: 2017/02/16 08:17:04
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp> and Yoshihiro Oyama / < oyama @ cs.tsukuba.ac.jp >