web-dev-qa-db-ja.com

親プロセスによって子プロセスを強制終了する方法は?

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

22
miraj

SIGTERMまたはSIGKILLを送信します。

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

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

SIGTERMは礼儀正しく、プロセスをクリーンアップしてから実行しますが、SIGKILLはリッスンしない場合に使用します> :)

シェルの例(manページ: http://unixhelp.ed.ac.uk/CGI/man-cgi?kill

-9 pidを殺す

Cでは、kill syscallを使用して同じことを実行できます。

kill(pid, SIGKILL);

次のマニュアルページを参照してください。 http://linux.die.net/man/2/kill

28
Mikola

次のようなものを試してください:

#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.
         */
    }
}
7
Abhijit

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

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

子プロセスでwait()を呼び出して、ゾンビが残るのを防ぎます。

1
jbruni