Yash 2 その 38: シグナルの扱いが間違っていた
Darwin でシグナルのテストスクリプトが通らなかったお蔭でシグナルの扱い方の誤りに気づいた。
通らなかったコードはこれ:
sleep 30 &
kill -s TTOU $!
wait $!
kill -l $?
sleep コマンドを裏で起動した直後にそれをシグナルで止める、というのが最初の 2 行。ところがこれが当初 Darwin では動かなかった。理由は sleep を実行するためのサブシェルがシグナルの設定を変更するのと kill がシグナルを送るのとで競合が発生していたから。
元元シェルのプロセスは SIGTTOU などいくつかのシグナルを無視するようになっている。これまではこの状態のままサブシェルを分岐してサブシェルでシグナルの無視を解除してからコマンドを起動していたのだが、これだと無視を解除する前に kill が行われてしまうと無視すべからざるシグナルを無視してしまう。
元のシェルのプロセスで無視を一時的に解除してから分岐するようにして、正しく動くようになった。
| 固定リンク
コメント