我正在尝试创建一个实际上支持子进程的应用程序。问题是,完成所有分叉后,我不需要退出应用程序来关闭所有子进程。
我正在使用以下代码:
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 );
但问题是不会只杀死衍生的叉子。它也会杀死父进程。有什么想法吗?
答案 0 :(得分:2)
您可以使用kill()
&amp;在指定的间隔后发送它的计时器。
int kill(pid_t pid, int sig);
ex:kill(0,SIGTERM);
如果pid等于0,那么sig将被发送到调用进程的进程组中的每个进程,因为当进程分叉时,它会从其父进程继承其PGID。