- 締切済み
プロセスグループについて
スレッドで起動されたプロセスは親プロセスをリーダとするプロセスグループを形成するというのは、シグナル処理で理にかなっていると理解しているのですが、シェルからパイプで繋いで起動してプロセスもプロセスグループを形成する。とある本に書いてありました。セッションとのからみかな。と漠然と思ったりしているのですが、パイプで繋いだプロセスが何故プロセスグループを形成する必要があるのか見えてきません。パイプで繋いだプロセスは、何故シェルを親とするプロセスグループ形成する必要があるのでしうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- notnot
- ベストアンサー率47% (4900/10358)
正確にはなんと書いてあったのでしょうか? 以下、回答になるかどうかわかりませんが、用語の説明をします。 シェルにおいては、1つの実行単位をパイプラインと呼びます。必ずしも | で結ばれていなくても。 man bashでは、このように書かれています。 >パイプライン (pipeline)は、記号 | で区切った 1 つ以上のコマンド列です。パイプラインのフォーマットを以下に示します: > > [time [-p]] [ ! ] command [ | command2 ... ] つまり、コマンド1つの場合も含まれるので、シェルプロンプトで、 $ date [Enter] としても、それは一つのパイプラインなわけで、1つのプロセスグループを形成します。jobsやfg、bgコマンドなどでハンドリングする単位です。この意味ではジョブとも呼ぶ。 セッションというのは、昔は端末プロセスグループと呼んだものだと思いますが、同じ制御端末を有するプロセスグループ群で、端末が死んだときにSIGHUPが送られる範囲を指すと思います。 システムコールやプロセス間通信の意味でのパイプと、上記シェルのパイプラインが厳密に使い分けられているかどうかは疑問で、両者とも単にパイプと呼ばれているような気がします。プロセスグループに関連して出てきた「パイプ」という用語はまず間違いなく「パイプライン」のことだと思います。
お礼
そうそうの回答ありがとうございます。原文では「プロセスグループはシェルのパイプでつながれたプロセス群で、ジョブに対応します。」となっていました。 確かに内部的にはパイプはファイルと同じように、マウントできないpipfsファイルシステム下のinodeベーの読み書き。と認識しております。notnotさんの仰るようにここはパイプラインのことではと思っています。
補足
先にアップしてからふと思ったのですが、パイプラインは一方のプロセスのファイルディスクリプタ0の標準入力を、片方のファイルディスクリプタ1に、ファイルディスクリプタ1の標準出力を片方のファイルディスクリプタ0に繋ぎ変えて、そして内部的には通常のパイプと同じ処理をしているのではと。 そうなると、プロセスグループである必要がない。(プロセスグループはただタスク構造体のtgidというメンバーにプロセスリーダとなる親プロセスIDを設定しとそのリストを作っているだけ、大した処理はしてないようです。)そうなると、パイプラインを形成するのにプロセスグループが必要というのでなく、もし片方のプロセスにエラーが発生してフリーズしてしまえば、一方のプロセスの入出力ができなくなってしまい、そのような事態をさけるために、一方がアボートすれば他方のプロセスもアボートするようにするためでは。と思ったしだいなのですが・・・。どのようなものでしょうか?