Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

getppid

9 views
Skip to first unread message

NIDE Naoyuki

unread,
Dec 26, 2005, 8:10:04 AM12/26/05
to
Perlのgetppidの意味っていつの頃からか変わってしまったんですね。(Linux
だけかもしれませんが)

$ perl -e 'exit if fork; sleep 1; print getppid, "\n"'

で、以前は1が表示されていましたが、今では元の親プロセスのPIDが表示されま
す。おかげで、本来の親が死んだかどうかを、getppidが1を返すかどうかで判定
することができなくなってしまいました。
今は、親が死んだかどうかを判定するにはどうすればいいんでしょう?

実はgawkも同様なんですよね…
ni...@ics.nara-wu.ac.jp

Shinji KONO

unread,
Dec 26, 2005, 8:34:09 AM12/26/05
to
河野真治 @ 琉球大学情報工学です。

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
河野真治 @ 琉球大学工学部情報工学科

NIDE Naoyuki

unread,
Dec 26, 2005, 1:09:22 PM12/26/05
to
In article <3992579...@rananim.ie.u-ryukyu.ac.jp>,

ko...@ie.u-ryukyu.ac.jp writes:
> > 今は、親が死んだかどうかを判定するにはどうすればいいんでしょう?
> pipe を開けておいて、sigpipe を見るなんてのを思い付きますが...

なるほど。と思ったんですが、何だかうまく行かない…なぜだろう…
元々の問題は、結局別な方法で解決しました。いくつかの用途に使うために、
「指定したコマンドを指定した引数で動かすが、それが一定時間たっても終了し
なければkill -TERMする」という小ツール(netatalkにはtimeoutというコマンド
が含まれているらしいですが、それとほぼ同じもの)を昔作ったんですが、それ
の実装が、Perlを使って「親はコマンドを実行、子は0.5秒ずつ待って、親が死
ねば子も終了、親が生きているうちに所定の待ち時間が過ぎれば子は親をTERM」
というものだったのです。それが、getppidの機能変更でうまくいかなくなった。
そこで、親と子を逆にして、子がコマンドを実行、親はwaitとalarmをし、時間
切れの方が先に来たら子をTERM、というように変えちゃいました。今のところこ
れでうまくいっています。
ni...@ics.nara-wu.ac.jp

Hideo Sir MaNMOS Morishita

unread,
Dec 26, 2005, 9:18:10 PM12/26/05
to

In article <0512262210...@hayabusa.ics.nara-wu.ac.jp>,

ni...@ics.nara-wu.ac.jp (NIDE Naoyuki) writes:
> Perlのgetppidの意味っていつの頃からか変わってしまったんですね。(Linux
> だけかもしれませんが)
>
> $ perl -e 'exit if fork; sleep 1; print getppid, "\n"'
>
> で、以前は1が表示されていましたが、今では元の親プロセスのPIDが表示されま
> す。おかげで、本来の親が死んだかどうかを、getppidが1を返すかどうかで判定
> することができなくなってしまいました。
> 今は、親が死んだかどうかを判定するにはどうすればいいんでしょう?


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

NIDE Naoyuki

unread,
Dec 26, 2005, 11:54:58 PM12/26/05
to
In article <squpsnj...@stellar.co.jp>,

man...@stellar.co.jp writes:
> > 今は、親が死んだかどうかを判定するにはどうすればいいんでしょう?
> perlはどうかわからないのですが、cならkill(pid,0)でerrnoがESRCになるか
> 見るんですけど。

おお、なるほど。ありがとうございます。Perlだとkillはシグナルが実際に送
れたプロセスの数を返すので、kill(0, getppid())が1かどうかをチェックする
ことでうまくいきました。

…が、よく考えてみると、親が既に死んでいて、それと同じPIDの新しいプロ
セスが誕生していたりすると、これでは誤判定するんでしょうかね…(そこまで
は試していません)
ni...@ics.nara-wu.ac.jp

Shinji KONO

unread,
Feb 6, 2006, 1:25:52 AM2/6/06
to
河野真治 @ 琉球大学情報工学です。

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してく
れるんじゃなかったっけ...

0 new messages