Yash 2 その 284: ジョブ制禦外のジョブの状態は自動的に報告されるべきか
しばらく yash のコードをコミットしてゐなかったのでそろそろリリースするかと準備を始めたら面倒くさいバグを見付けてしまった。
Echo コマンドを組込みコマンドとして有効にしないオプションでビルドするとテストが一件失敗する。exec >fifo&
が実行された後 cat fifo
が実行される前に [1] + Running exec 1>fifo が出力されてしまふ。原因を調べてゆくといろいろ面倒な事実が分かった。
上記の様なジョブの状態の報告は print_job_status_all
関数の中で行ってをり、これは handle_sigchld
関数から呼ばれる。が、SIGCHLD シグナルを一つでも受信してゐないと関数の冒頭でフラグが立たず print_job_status_all
関数は呼ばれない。これだと、新たなジョブが追加された後でも SIGCHLD が来るまではジョブの状態が報告されないことになる。
とはいへ、ジョブ制禦が無効なシェルで nofity オプションを有効にした時、それぞれのジョブの状態変化はいちいち自動的に報告されるべきなのだらうか。POSIX の規定はいまいちはっきりしない (そもそもジョブ制禦の対象となってゐないコマンドがジョブ
に含まれるのか曖昧だ)。Yash 以外のシェルの動作は大まかに二通りあり、
- 一つ目は一切自動的に報告しない。(dash, zsh)
- もう一つはバックグラウンドジョブが始まるときにジョブ番号とプロセス番号を自動的に出力する。ただし notify オプションに関係なく、対話シェルなら常に出力する。(bash, ksh, mksh)
これまでの yash はどちらでもなく、できるだけリアルタイムに print_job_status_all
関数を呼んでジョブの状態を出力しようとする。いづれにしても POSIX 的に正解といふものは無さうだ。
とりあへず、SIGCHLD を受信したかどうかでジョブの状態変化が報告されたりされなかったりするのは直すつもりだが、その点以外に yash の動作を変へるべきか否か結論は出てゐない。
| 固定リンク
コメント