- 締切済み
プロセスグループについて(その2)
先日プロセスグループについて問い合わせたものです。投稿してからもずーっと気になって考えていたのですが、たぶんこうではないか。と思い自己レスですが報告かねて投稿いたしました。なお、質問者は回答できない。ということで、前回の質問は締め切って、新規に再アップいたしました。突っ込み、ホロー有りましたらよろしくお願いいたします。 パイプラインで2つのプロセス繋ぐと、最初のプロセスが標準入力となり、次のプロセスが標準出力になります。そうなると2つで端末を占有するということで、そのため同じセッションとするためこの2つをプロセグループにしていると・・・
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
先の回答に書きましたが、パイプラインが1つのプロセスグループを形成するのは、ジョブコントロール(jobs,bg,fgコマンドとctrl-Zであつかう「ジョブ」)のためです。 これらのコマンド群をひとまとめにして、SIGINT(ctrl-C)、SIGTERM(kill %1等)、SIGCONT(bg,fg)、SIGSTOP(ctrl-Z)などのシグナルを送るためです。 なお、先の回答で誤解を与えたかもしれませんが、シェルのパイプラインというのは、コマンドが2つ以上の場合、前のコマンドの標準出力と次のコマンドの標準入力をパイプ(システムコールやプロセス間通信の説明文脈で使われるパイプ)でつないだものです。 従って、 >パイプラインで2つのプロセス繋ぐと、 という表現は間違いです。 パイプライン=コマンドをパイプでつないだもの(コマンドが1つだけのケースを含む) ◎パイプでつながれた片方のプロセスがハング(別のイベントを永久に待つorループ)したときに、他方のプロセスがそれを自動的に知る手段はありません。 ◎パイプでつながれた前段のプロセスが先に終了した場合またはパイプをクローズした場合、後段プロセスがパイプから読み出しをした場合データが終わればEOFが返るので、前段の終了orクローズを知ることが出来ます。 ◎パイプでつながれた後段のプロセスが先に終了した場合またはパイプをクローズした場合、前段のプロセスがパイプに書き込もうとすると、SIGPIPEのシグナルが前段プロセスに対して発行されます。そのシグナルを受けてどうするかはそのプログラムの作りに依存。普通は無視か、プログラムのエラー終了。
お礼
重ね重ね回答ありがとうございます。プロセスグループとスレッドグループとこんがらがって考えていたようです。notnotさんの仰る内容を自分の知識とするたために検証してみました。お礼かねその内容を同じ疑問を抱かれてい方への助けとなればと思いアップさせて頂きます。 a.outは永久sleepするだけのプロセスです。 [root@localhost test]# ./a.out & [1] 10629 [root@localhost test]# ./a.out | ./a.out & [2] 10631 [root@localhost test]# ps -j PID PGID SID TTY TIME CMD 4358 4358 4358 pts/1 00:00:03 bash 10629 10629 4358 pts/1 00:00:00 a.out 10630 10630 4358 pts/1 00:00:00 a.out 10631 10630 4358 pts/1 00:00:00 a.out 10632 10632 4358 pts/1 00:00:00 ps ・最初のa.outは自分自身をリーダとする1つのプロセスグループ ・次の2つは2番目のa.outをリーダとする1つのプロセスグループ bashから起動毎に、それ自身がリーダとなるプロセスグループを形成(psについても同様) kill 10630 としても、killされたのは、2番目のa.outのみでした。 kill -- 10630 とすれば、2番目と3番目のa.outがkillされました。 --オプションでプロセスIDでなくプロセスグループにシグナルを送信している。 同じ端末から起動しているのでセッションIDは同じ。それ故セッションをクローズするとこれらのプロセスにシグナルが送信されてkill(?)。 [root@localhost test]# jobs [1]- Running ./a.out & [2]+ Running ./a.out | ./a.out & プロセスグループ毎にジョブとなる。 とりあえずの結論ですが、パイプラインで繋げばプロセスグループになるのは、繋いだプロセス郡を1つのジョブとして考えた方がシグナル送信等(?)で都合がよい。