2016-02-10 9 views
5

他のプログラムを実行するには自分のプログラムが必要ですが、他のプログラムが時間制限内に戻らない場合は、それを強制終了する必要があります。私は働いているように見える以下の解決策を思いついた。linuxで他のプログラムが停止したプロセスを監視して終了するための良い方法はありますか?

int main() 
{ 
int retval, timeout=10; 
pid_t proc1=fork(); 

if(proc1>0) 
{ 
    while(timeout) 
    { 
     waitpid(proc1, &retval, WNOHANG); 
     if(WIFEXITED(retval)) break; //normal termination 
     sleep(1); 
     --timeout; 
     if(timeout==0) 
     { 
      printf("attempt to kill process\n"); 
      kill(proc1, SIGTERM); 
      break; 
     } 
    } 
} 
else if(proc1==0) 
{ 
    execlp("./someprogram", "./someprogram", "-a", "-b", NULL); 
} 
//else if fork failed etc. 
return 0; 
} 

私は私のプログラムは、可能な限り堅牢である必要がありますが、私はそれで問題が発生する可能性がに気づいてないかもしれないので、私はLinuxでのプログラミングに新しいです。私の質問は次のとおりです: 1.これはこの特定の問題の適切な解決策ですか、それとも良い方法がありますか? 2.予期しない動作やシステムリソースのリークを引き起こす可能性のある問題やバグが誰にも見えますか?

答えて

2

(WIFEXITED(retval))は、プログラムがシグナルによって殺された場合にtrueを返しません(セグメンテーション違反によるクラッシュを含む)。

waitpidから成功したリターンをチェックするのが最も良いでしょう。それは、プログラムが終了した場合(自発的にかどうかにかかわらず)にのみ発生します。それはプロセスがなくなっていることを確認することがいかに重要であるかに応じて、

...
SIGTERMでプロセスを殺した後、あなたは他の第2ほどを眠ることができ、それはまだ行っていない場合は、確かにSIGKILLを使用しています。

+0

ありがとうございます。したがって、その仕様に従って、 'WNOHANG'を持つ 'waitpid'は、子プロセスが「状態が変更された」ときに> 0の値を返します。つまり、この「状態の変化」はプロセスの終了時にのみ起こることを意味しますか? – vapid

+0

あなたの目的のために、唯一の状態変更は、プロセスが終了するときです。他の使い方は、(a)デバッガを書いている場合(つまり 'ptrace(2)'を使って)、(b) 'WUNTRACED'または' WCONTINUED'フラグを指定した場合、停止信号(例えば、Ctrl-Z)または停止からの継続があるときに通知されます。 –

関連する問題