« Yash 2 その 37: kill コマンド | トップページ | テレビ番組等感想 その 114 »

2008年7月21日 (月)

Yash 2 その 38: シグナルの扱いが間違っていた

Darwin でシグナルのテストスクリプトが通らなかったお蔭でシグナルの扱い方の誤りに気づいた。

通らなかったコードはこれ:

sleep 30 &
kill -s TTOU $!
wait $!
kill -l $?

sleep コマンドを裏で起動した直後にそれをシグナルで止める、というのが最初の 2 行。ところがこれが当初 Darwin では動かなかった。理由は sleep を実行するためのサブシェルがシグナルの設定を変更するのと kill がシグナルを送るのとで競合が発生していたから。

元元シェルのプロセスは SIGTTOU などいくつかのシグナルを無視するようになっている。これまではこの状態のままサブシェルを分岐してサブシェルでシグナルの無視を解除してからコマンドを起動していたのだが、これだと無視を解除する前に kill が行われてしまうと無視すべからざるシグナルを無視してしまう。

元のシェルのプロセスで無視を一時的に解除してから分岐するようにして、正しく動くようになった。

|

« Yash 2 その 37: kill コマンド | トップページ | テレビ番組等感想 その 114 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/169172/41925082

この記事へのトラックバック一覧です: Yash 2 その 38: シグナルの扱いが間違っていた:

« Yash 2 その 37: kill コマンド | トップページ | テレビ番組等感想 その 114 »