44

I create a child process using a fork(). How can the parent process kill the child process if the child process cannot complete its execution within 30 seconds? I want to allow the child process to execute up to 30 seconds. If it takes more than 30 seconds, the parent process will kill it. Do you have any idea to do that?

miraj
  • 493
  • 2
  • 6
  • 7

3 Answers3

52

Send a SIGTERM or a SIGKILL to it:

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

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

SIGTERM is polite and lets the process clean up before it goes, whereas, SIGKILL is for when it won't listen >:)

Example from the shell (man page: http://unixhelp.ed.ac.uk/CGI/man-cgi?kill )

kill -9 pid

In C, you can do the same thing using the kill syscall:

kill(pid, SIGKILL);

See the following man page: http://linux.die.net/man/2/kill

Stargateur
  • 24,473
  • 8
  • 65
  • 91
Mikola
  • 9,176
  • 2
  • 34
  • 41
15

Try something like this:

#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.
         */
    }
}
Farokh KH
  • 23
  • 3
Abhijit
  • 199
  • 4
  • Do I need to reset the alarm (`alarm(0)`) in parent part if child executes before 30 seconds? – miraj Jun 28 '11 at 07:17
  • @miraj Hello, have you got the solution to cancel the alarm? I have a similar question, I write a socket client/server, the server fork a child process when socket client ask to connect, but if the child doesn't send any message in 1 minute, the server will kill the child process. If the client send message to server, the timer will be reset to 1 minute again. – charles.cc.hsu Oct 23 '16 at 09:44
0

In the parent process, fork()'s return value is the process ID of the child process. Stuff that value away somewhere for when you need to terminate the child process. fork() returns zero(0) in the child process.

When you need to terminate the child process, use the kill(2) function with the process ID returned by fork(), and the signal you wish to deliver (e.g. SIGTERM).

Remember to call wait() on the child process to prevent any lingering zombies.

jbruni
  • 1,238
  • 8
  • 12