システムプログラム練習問題#5

練習問題(501)

kill システムコールでシグナルを送るプログラムとシグナルを受け取るプログラムを使用して,プロセスからプロセスへシグナルが送られるのを確かめなさい.

ヒント:端末ウィンドウを2つ開き,1つでシグナルを受け取るプログラムを動かし,もう1つでシグナルを送るプログラムを動かす. シグナルを送る相手のプロセスのIDは ps コマンドで調べるか,プログラムを変更して自分のプロセスIDを表示させるようにする.

練習問題(502)

複数の異なるシグナルに対しシグナルハンドラを設定し,シグナルに応じたシグナルハンドラが起動されることを確かめなさい.

練習問題(503)

不正なメモリアクセスは SIGSEGV により通知される. 不正なメモリアクセスとなったアドレスを表示するプログラムを作成しなさい.

ヒント:SIGACTION(2) の siginfo_t の情報を参照.また,Linuxで実験した方が良いかもしれません.

練習問題(504)

sleep は実はライブラリ関数である. シグナルの機能を用い,SLEEP(3) 相当の機能を持つ関数 mysleep を作りなさい.

SLEEP(3) と同じ戻り値を返し,またそれを確かめる実行例を含めること. 現在時刻は TIME (3) により取得できる. 使用後,不要になったシグナルの設定はキャンセルし,もとの設定に戻すこと. NANOSLEEP(2) は使用しないこと. リエントラントである必要はない.

練習問題(505)

キーボードから1文字入力を読み込む関数 getchar にタイムアウト機能を追加した関数 mygetchar を作りなさい.

実行例では,上記仕様を満たしていることを,戻り値,および現在時刻を TIME (3) により得た値を CTIME (3) により文字列に変換して表示することで,示しなさい.

なお、プログラムはリエントラントである必要はない.

練習問題(506)

練習問題(407)と同じように,親プロセスと子プロセスが交互に実行することにより,交互に1文字出力するプログラムを,シグナルを用いて書きなさい. fork で作る子プロセスは1つだけとする.