Shell の実装

Menu

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 に相当するものを実装するには、どうすれば良いか。


Shinji KONO / Tue Nov 22 13:55:47 2011