2011-06-28 18 views
18

fork()を使用して子プロセスを作成します。子プロセスが30秒以内に実行を完了できない場合、親プロセスはどのように子プロセスを強制終了できますか?子プロセスが最大30秒間実行できるようにしたい。 30秒以上かかると、親プロセスがそれを強制終了します。あなたはそれをする考えがありますか?親プロセスによって子プロセスを強制終了するにはどうすればいいですか?

答えて

22

それにSIGTERMまたはSIGKILLを送信:とき、それはないでしょうSIGKILLがためで、一方

http://en.wikipedia.org/wiki/SIGKILL

http://en.wikipedia.org/wiki/SIGTERM

SIGTERMは、丁寧であり、それは行く前にプロセスをクリーンアップすることができます>聞く:)シェル(manページ:http://unixhelp.ed.ac.uk/CGI/man-cgi?kill)から

殺す-9 pidをCで

、あなたは、killシステムコールを使用して同じことを行うことができます。

kill(pid, SIGKILL); 

次のマニュアルページを参照してください:フォーク、親プロセスではhttp://linux.die.net/man/2/kill

1

を()の戻り値は、子プロセスのプロセスIDです。子プロセスを終了する必要があるときのためにどこかで価値があるもの。 fork()は子プロセスでゼロ(0)を返します。

子プロセスを終了する必要がある場合は、fork()によって返されたプロセスIDと配信するシグナル(たとえばSIGTERM)とともにkill(2)関数を使用します。

残っているゾンビを防ぐために、子プロセスでwait()を呼び出すことを忘れないでください。

7

はこのような何かを試してみてください:

#include <signal.h> 

pid_t child_pid = -1 ; //Global 

void kill_child(int sig) 
{ 
    kill(child_pid,SIGKILL); 
} 

int main(int argc, char *argv[]) 
{ 
    signal(SIGALRM,(void (*)(int))kill_child); 
    child_pid = fork(); 
    if (child_pid > 0) { 
    /*PARENT*/ 
     alarm(30); 
     /* 
     * Do parent's tasks here. 
     */ 
     wait(NULL); 
    } 
    else if (child_pid == 0){ 
    /*CHILD*/ 
     /* 
     * Do child's tasks here. 
     */ 
    } 
} 
+0

私はアラームをリセットする必要があります( 'アラーム(0)')親部品で子供が30秒前に実行した場合? – miraj

+0

@mirajこんにちは、あなたは、アラームをキャンセルするソリューションを持っていますか?私は同様の質問がありますが、ソケットクライアント/サーバーを作成し、ソケットクライアントが接続を要求するときにサーバーが子プロセスをforkしますが、子プロセスが1分以内にメッセージを送信しない場合、サーバーは子プロセスを終了します。クライアントがサーバーにメッセージを送信すると、タイマーは再び1分にリセットされます。 –

関連する問題