$ perl -e 'exit if fork; sleep 1; print getppid, "\n"'
で、以前は1が表示されていましたが、今では元の親プロセスのPIDが表示されま
す。おかげで、本来の親が死んだかどうかを、getppidが1を返すかどうかで判定
することができなくなってしまいました。
今は、親が死んだかどうかを判定するにはどうすればいいんでしょう?
実はgawkも同様なんですよね…
ni...@ics.nara-wu.ac.jp
In article <0512262210...@hayabusa.ics.nara-wu.ac.jp>, ni...@ics.nara-wu.ac.jp (NIDE Naoyuki) writes
> $ perl -e 'exit if fork; sleep 1; print getppid, "\n"'
> で、以前は1が表示されていましたが、今では元の親プロセスのPIDが表示されま
> す。
それは知りませんでした...
> おかげで、本来の親が死んだかどうかを、getppidが1を返すかどうかで判定
> することができなくなってしまいました。
> 今は、親が死んだかどうかを判定するにはどうすればいいんでしょう?
pipe を開けておいて、sigpipe を見るなんてのを思い付きますが...
---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科
なるほど。と思ったんですが、何だかうまく行かない…なぜだろう…
元々の問題は、結局別な方法で解決しました。いくつかの用途に使うために、
「指定したコマンドを指定した引数で動かすが、それが一定時間たっても終了し
なければkill -TERMする」という小ツール(netatalkにはtimeoutというコマンド
が含まれているらしいですが、それとほぼ同じもの)を昔作ったんですが、それ
の実装が、Perlを使って「親はコマンドを実行、子は0.5秒ずつ待って、親が死
ねば子も終了、親が生きているうちに所定の待ち時間が過ぎれば子は親をTERM」
というものだったのです。それが、getppidの機能変更でうまくいかなくなった。
そこで、親と子を逆にして、子がコマンドを実行、親はwaitとalarmをし、時間
切れの方が先に来たら子をTERM、というように変えちゃいました。今のところこ
れでうまくいっています。
ni...@ics.nara-wu.ac.jp
perlはどうかわからないのですが、cならkill(pid,0)でerrnoがESRCになるか
見るんですけど。
--
___ わしは、山吹色のかすてーらが大好きでのぅ
[[o o]] ふぉっふぉっふぉ
'J' 森下 お代官様 MaNMOS 英夫@ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D 02 74 87 52 7C B7 39 37
おお、なるほど。ありがとうございます。Perlだとkillはシグナルが実際に送
れたプロセスの数を返すので、kill(0, getppid())が1かどうかをチェックする
ことでうまくいきました。
…が、よく考えてみると、親が既に死んでいて、それと同じPIDの新しいプロ
セスが誕生していたりすると、これでは誤判定するんでしょうかね…(そこまで
は試していません)
ni...@ics.nara-wu.ac.jp
In article <0512271354...@azusa.ics.nara-wu.ac.jp>, ni...@ics.nara-wu.ac.jp (NIDE Naoyuki) writes
> おお、なるほど。ありがとうございます。Perlだとkillはシグナルが実際に送
> れたプロセスの数を返すので、kill(0, getppid())が1かどうかをチェックする
> ことでうまくいきました。
これなんですが、..
> …が、よく考えてみると、親が既に死んでいて、それと同じPIDの新しいプロ
> セスが誕生していたりすると、これでは誤判定するんでしょうかね…(そこまで
> は試していません)
これは自分でなければ permision denied になります。
なんだが、Vine Linux の新しいのだと、daemon から起動したときと、
command line から起動した時で挙動が違って、daemon から起動すると、
親は exit した後も defunct
に留まるみたい。
親が defunct する条件ってなんだっけかな。もしかすると、close して
ないfile descriptorがあるのかな。exit すれば全部closeしてく
れるんじゃなかったっけ...