Path: sran265!katsu From: katsu@sran14.sra.co.jp (Katsuhiro Watanabe) Message-ID: Date: 13 May 92 08:36:47 Organization: Software Research Associates, Inc.,Japan In-reply-to: gotoh@radix.co.jp's message of 27 Apr 92 04:50:57 GMT Newsgroups: fj.questions.unix Subject: Re: ps command & child process Distribution: fj References:  jp で一番フォローが遅い渡邊@sraです。 SunOS 4.0.1 の上の ps とプロセス階層の関係について 記事 で gotoh@radix.co.jp (Syuichi Gotoh) さんいはく >  fork()でプロセスを孫プロセスまで作り、psコマンドで確認しようと > しました。 >  最初に親プロセスが死に、次に子、そして孫が死ぬ様な場合で、wait() > を行っていません。  という状況下で、親が死んで子供や孫はまだ生きている状態で ps すると、 >  オプションなしのpsだと、どうして孫プロセスは表示されて、まだ生きてい > る子プロセスは表示されないのでしょうか. となる一方で、ps -x だと子も孫も表示されるのは何故かという疑問が 提示されています。  man ps の -g の記述によれば、ps は普段はプロセスグループリーダーを 表示せず、これによって getty/login やトップレベルのシェルなど、 "interesting" でないプロセスは除外していることになっています。  ここで、プロセスグループリーダーを除外するというのは嘘のようです。 何故なら、例えば csh から会話的に起動されるプロセスはプロセスグループ リーダーとなりますが、大抵の場合 csh 自身に比べればよっぽど "interesting" なプロセスのはずです。多分、事情の歴史的変化か何かが man に反映されずにいるのでしょう。 マニュアルの言う「トップレベルの シェル」などを素直に考えれば、init の子供を "interesting" でないものと するのが自然ですが、実際の ps の振舞いを見てもそうなっていると思います。  一方プロセス階層の方に戻って考えると、"親"プロセスが死んだならば "子"のプロセスは init の子供になります。つまり ps にとって "interesting" でないプロセスになります。"孫"の親は"子"ですから "interesting" な ままです。よって ps で見ると"子"だけが表示されます。  ps -x で "interesting" でない"子"も出てくる理由ですが、ps の振舞いから 帰納的に考えて、-x を指定すると -g を指定したことになるんだと思いますが、 どういう哲学でそうなっているのか不明です。多分、 -x をつけた(制御端末のないプロセスの状態も知りたい) → 実は「daemon 類の状態を知りたい」という(より抽象的な)要求なのだろう → でも daemon 類は init の子になってることが多いから、-g なしでは出ない → 老婆心で -g も指定されたことにしておいてやろう という解釈で設計したのだろうと私は推測してます。 -- ----____----____ 渡邊克宏 SRAソフトウェア工学研究所