プロが教えるわが家の防犯対策術!

Perlを起動させたプログラムが不慮の死をとげるなどして、
起動時に開かれた標準入出力が、動作中に閉じられた場合、ゾンビ防止用として処理を終了させる必要があります。
これはどうやって調べたら良いのでしょうか?

現在は事故が起きた場合、
while (<STDIN>){}
の処理が突然、停止せずに無限ループを開始し始めてるのだろうと思います。
いきなりCPUを大量に使い、メモリが一気に膨れ上がります。
(たまに気づいたらそうなってるので確かめるのは難しいです)。

ちなみにコマンドプロンプトから呼び出された場合は、プロンプトが死ぬ間際に確実に始末してくれてるようですが、
(100万回ループでコマンドプロンプトを起動し、即座にそれを殺すとPerlもそれに伴って全部死んだ)、
世の中には粗悪なプログラムもあるようで、この粗悪なプログラムが死んだとき、ちゃんとPerlを殺してくれないらしいっぽい時がたまにあります。

質問者からの補足コメント

  • windowsです。
    すでに解決した可能性はあるのですが、
    粗悪なプログラムは気まぐれのように500回に一度程度(?)殺してくれないので、最終的な確認が出来ません。

      補足日時:2015/05/24 01:47

A 回答 (2件)

子プロセスが親プロセスの終了を検出するには、ppidが変化したのを見ればいいんじゃない?



$ cat foo.sh

#!/bin/bash

echo "parent : pid = $$"

(i=5; while [ $i -gt 0 ]; do echo $i; i=$(expr $i - 1); sleep 1; done) | perl -e 'while(<STDIN>){print "child : ppid = ", getppid(), " : ", $_}' &

sleep 1
echo 'parent : exit'
exit

$ sh foo.sh
parent : pid = 23173
child : ppid = 23173 : 5
parent : exit
child : ppid = 1 : 4
child : ppid = 1 : 3
child : ppid = 1 : 2
child : ppid = 1 : 1
    • good
    • 0

クローズされた入力から読もうとするとEOFになり、クローズされた出力に書くと単に捨てられるだけだと思います。


無限ループになるとしたら、クローズされたわけではないのでは?標準入力は何に関連付いていたのでしょうか?ファイル?パイプ?

ちなみに、Unix/Linuxだと親プロセスが死んでも自動的には子プロセスは死にません(死に際に子プロセスを殺すように書かれている親プログラムはあります)。
Windowsは知りません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!