いずれも、coins のユーザ名とパスワードが必要です。ユーザ名とパスワード
を打つ時には、SSL が有効になっていることを確認してください。また、URL
が https://idp.coins.tsukuba.ac.jp/
で始まっ
ていることを目で確認して下さい。
Manaba 小テストの「端末(1)」と「端末(2)」に回答しなさい。
上記のコマンド 1. と 3, または 2. と 4 を比較しなさい。 Type 3 のシステム・コールを1つ選び、説明しなさい。
上記のコマンド 5. で使われたシステム・コールのうち、Type 3 のものを列挙しなさい。 これらのシステム・コールについて、 その引数、結果、意味を man コマンド等で調査しなさい。 上記のコマンド 5. でどのような引数で呼び出されたのか説明しなさい。
上記のコマンド 5. と 6. を比較し、 使われているシステム・コールの観点から違いを述べなさい。
次のオプションの動作を確認しなさい。
-a, -c, -d, -i, -l, -L, -R, -t
ls -l コマンドを使って、既に開発環境のシステムに存在する、次のようなファ イルの例を表示しなさい。
次のようなシンボリック・リンクを作成しなさい。
通常のパス名とシンボリック・リンクを使ったパス名を用いて同じファイルを 複数の名前で扱えることを、ls コマンドやcat コマンドを使って示しなさい。
この課題のプログラムはC言語を用いて作成しなさい。
以下に記述されたコマンドの利用方法のうち、 各グループ2個以上選び、マニュアルを読み、実際に実行してコマンドの働きを調べなさい。 この時、例に記述された利用方法を全て実行してみなさい。たとえば、引数と して複数のファイルが指定できる場合やディレクトリ名を指定できる場合はそ のような例を実行してみなさい。また、例に示されたオプションを利用してみ なさい。
(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
(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
(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 .
(23) id コマンド
$ id
$ id loginname
(24) groups コマンド
$ groups
(25) su コマンド
$ su
(26) sudo コマンド
$ sudo shutdown now
(27) time コマンド
$ time ./a.out
$ time ./a.out > /dev/null
(28) true コマンド
$ if true; then echo OK $?; else echo NG $?; fi;
$ if ! true; then echo OK $?; else echo NG $?; fi;
(29) kill コマンド
$ kill PID
$ kill -KILL PID
$ kill -9 PID
(30) watch コマンド
$ watch who
(31) xargs コマンド
$ find . -name '*.[ch]' -newer a.out -print | xargs head
$ file /usr/bin/* | awk -F: '/shell script/ {print $1}' | xargs wc
(32) 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.'
(33) nohup コマンド
$ nohup make > log 2>&1 &
作成したコマンドが持っている外部仕様(機能と制限事項)について,報告書に 明確に記述しなさい.当然のことながら,多くの機能があり,制限がないこと が望ましい.作成した機能を説明するために,十分な実行例を添付しなさい. UNIX上の既存のコマンドと実験で作成したコマンドの出力を比較しなさい.
この課題では,UNIX 上で動作する簡単なシェル(コマンド・インタプリタ)を作成する. この実験の目的は,簡単なシェルの作成を通じて,プロセスの生成,入出力の切替え,パイプの動作について深く理解することである. (注意: この課題は、C 言語でシェルを作成するものである。シェルスクリプトを作成するものではない。)
この課題3に関する補足説明を参考にしても良い.
課題Cのプログラムは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プロトコル用のバッファサイズに起因している.この点に注意をしてこ れらのシステムコールを使うこと.
この課題では,CGI が実行可能な Web サーバを作成する。 この実験の目的は,Web サーバに対して CGI を実行する機能を付加することで、 プロセスの生成,入出力の切替え,パイプの動作について深く理解することである. (注意: この課題は、C 言語で Web サーバを作成するものである。 既存の Web サーバで動作する CGI プログラムを作成するものではない。)
この課題のプログラムはC言語を用いて作成しなさい。
Coins では、Web サーバとして Apache httpd サーバが動作している。次のことを行い、Web サーバの動作を確認しなさい。
レポートには、上記のことを実行した時のアクセスログを含めなさい。
Content-Type: | 拡張子 |
---|---|
text/html | .html |
text/plain | .txt |
text/plain | .text |
image/gif | .gif |
image/jpeg | .jpeg |
image/png | .png |
複数のクライアントから同時に接続を受けるようにしなさい。 この課題では、クライアントごとに 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 とは異なっても良い。 少なくとも次のような項目を含めなさい。 これ以外の項目を含んでも良い。
.cgi
のプログラムを CGI と見
なし、プログラムを実行し、その結果をクライアントに返しなさい。
CGI プログラムが不正な結果を返した場合でも、Apache httpd と同様に クライアントには適切な HTTP に基づく応答を返しなさい。 CGI プログラムが標準エラー出力に出力した結果は、エラーログに保存しなさい。
実行結果が付されていない機能に関しては,実現されなかったものとみなす.