Path: sran265!katsu From: katsu@sran14.sra.co.jp (Katsuhiro Watanabe) Newsgroups: fj.unix Subject: Re: Kill child process, when parent process died. Message-ID: Date: 9 Dec 91 06:01:40 GMT References: Sender: news@sran265.sra.co.jp Followup-To: fj.unix Distribution: fj Organization: Software Research Associates, Inc.,Japan Lines: 60 In-reply-to: ura@lettuce.pa.Yokogawa.CO.JP's message of 2 Dec 91 05:33:31 GMT 親プロセスが死んだ時に子プロセスも死ぬような仕組みの構成法に関して、 親プロセスの終了を監視する祖母プロセスを設置する方策が提案されましたが、 記事 で ura@lettuce.pa.Yokogawa.CO.JP (Naoki Ura) さんいはく > 渡邊さん: > |というフォローが出ていますが、祖母プロセスが親プロセスと同じく > |「何らかの原因で」死ぬ場合のことは考えなくてもいいのですか? > 「何らかの原因」 というのを、「ソフトのバグによる原因で」と読み換えて、  技に走らず親プロセスの頑強性を増すのが一番ですが、そんなの百も承知の上 でしょうから、きっと何か深い訳か深いバグ :-) があるのでしょうね。 > 祖母プロセスが死んでしまった場合は、諦めることにしようかと思っていま > す。  祖母プロセスは単純明解で頑強性が高いと考えられますから、祖母が 死ぬ場合は滅多にない気はしますが、「諦め」なくとも方法はあります。 (1)プロセス間の親子関係を下のように構成する。 +---- +---- 親 ----+---- 子供達  祖母 ----+ +---- +---- 叔父 (2)祖母がプロセスグループリーダーになり、祖母、親、叔父、子供達の    プロセスグループを同一(仮に g)にする。 (3)祖母は wait(2) を繰り返し、その戻り値に対して以下を繰り返す。 if (親が死んだ) { killpg(g, SIG死ね); exit(1); } if (叔父が死んだ) 叔父を再起動する; /* 叔父が停止した時も wait(2) から抜けることに注意 */ (4)叔父は起動後、 kill(getpid(), SIGSTOP); pause();    しておく。一方で killpg(g, SIG死ね) するような SIGHUP の    ハンドラーを登録しておく。 こうしておけば、 (A)祖母が死ねば、停止している叔父に SIGHUP と SIGCONT が送られて    (BSD での exit(2) の振舞い)、叔父にみんな殺されます。 (B)親が死ねば、祖母の wait につかまって、祖母にみんな殺される。 (C)叔父が死んでも、祖母がもう一回生んでくれて正常な状態に戻る。 ということになります。  ただし、叔父のシグナルハンドラーや、祖母の子孫監視の部分などが 不可分という仮定の元でしかうまくいきません。つまり、親が死んだと 同時ぐらいにに祖母にも SIGKILL が送られたり、叔父が SIGHUP を 処理している間に叔父が死んだりすると、もうどうにもなりません。  いわばこれは「パズルの答え」的なもので、現実のプログラムに この手法を適用しても、さほど利益は得られないと思います。 ----____----____ 渡邊克宏 SRAソフトウェア工学研究所