« テレビ番組等感想 その 460: 2017 年第 2 四半期の纏め | トップページ

2017年7月 3日 (月)

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 の動作を変へるべきか否か結論は出てゐない。

|

« テレビ番組等感想 その 460: 2017 年第 2 四半期の纏め | トップページ

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: Yash 2 その 284: ジョブ制禦外のジョブの状態は自動的に報告されるべきか:

« テレビ番組等感想 その 460: 2017 年第 2 四半期の纏め | トップページ