-title: Shell の実装 Unix Shell の簡単な実装 を使って以下のことを調べよ。 修正したソースは、学科の mercural repository にいれること。 ssh://urasoe.ie.u-ryukyu.ac.jp//net/home/hg/y10/e105755/os/ex011 などのように repository の URL を示すこと。他の人から読める permission に設定すること。 ---コンパイルと動作の確認 shell.y は yacc/bison で書かれている。 make でコンパイルする。 cc -g -O2 -Wall -o my-shell shell.c -ly y.tab.c: In function ‘yyparse’: y.tab.c:1263: warning: implicit declaration of function ‘yylex’ shell.y:57: warning: implicit declaration of function ‘command’ shell.y:58: warning: implicit declaration of function ‘free_node’ shell.y: At top level: shell.y:105: warning: conflicting types for ‘free_node’ shell.y:58: warning: previous implicit declaration of ‘free_node’ was here shell.y: In function ‘free_node’: shell.y:108: warning: implicit declaration of function ‘close’ shell.y: At top level: などのエラーをすべて修正せよ。 ls | wc の実行が正しいことを確認せよ。 #define SHELL_DEBUG 0 の値を1にして debug message を出してみる。 --gdb で複数のプロセスをデバッグする execute() は fork した後で実行される。fork した先で止めたい。 ( fgetc を用いて、Shell を一旦止めて、別な gdb を fork した先に attach するなど...) execvp system call の直前で止めて、stack trace を示せ。 --pipe の振舞 pipe を実行した時に、execvp の直前の stdin, stdout, stderr は何を指しているのか調べたい。 fstat system call を使って必要な情報を表示して、何を指しているのかを調べよ。 --プログラムの間違いの修正 open のエラー処理がまったく行われていない。存在しないファイルを redirect で用いるとどうなるか 調べて、対策せよ。 Shell なので、エラーメッセージを表示して終了では正しい対策にはならない。 --signal の実装 signal を実装し、プロセスに signal を送れるようにしたい。 実装した singal を使って、kill や suspend などで、プロセスの状態がどう変わるかを調べよ。ps あるいは、top で調べる。 jobs command に相当するものを実装するには、どうすれば良いか。