强制子进程在fork之后退出

时间:2014-12-12 22:43:49

标签: c linux

我正在尝试创建一个实际上支持子进程的应用程序。问题是,完成所有分叉后,我不需要退出应用程序来关闭所有子进程。

我正在使用以下代码:

for(i=0;i<tot;i++) {
 switch(PID = fork()) {
    case -1:
      perror("[!] Couldn't fork!\n");
      exit(1);
    case 0:
    //do something
      exit(0);
    default:
      numforks++;
      if (numforks > THREADS)
          for (numforks; numforks > THREADS; numforks--)
              PID = wait(&status);
 }
}

while ((PID = wait(&status)) > 0);

问题是等待PID在上面完成,需要更长时间,因为有时很少有孩子只是挂起。我怎样才能实现在3秒后实际杀死子进程的东西?

我知道kill命令,但是我找不到解析所有forks子进程的方法并将SIGTERM信号发送给它们。

经过一番研究,我找到了这个解决方案:

int mypid;
mypid = getpid();
do {
    pid = waitpid(-1, NULL, WNOHANG);
     if ( errno == ECHILD ) break;
    if (pid != mypid)
        kill(pid, SIGKILL);
} while ( pid > 0 );

但问题是不会只杀死衍生的叉子。它也会杀死父进程。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用kill()&amp;在指定的间隔后发送它的计时器。

int kill(pid_t pid, int sig);

ex:kill(0,SIGTERM);

如果pid等于0,那么sig将被发送到调用进程的进程组中的每个进程,因为当进程分叉时,它会从其父进程继承其PGID。