【发布时间】:2014-12-12 22:43:49
【问题描述】:
我正在尝试创建一个实际派生子进程的应用程序。问题是所有分叉完成后,我不需要退出应用程序来关闭所有子进程。
我正在使用以下代码:
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 );
但问题在于,它不仅会杀死生成的分叉。它也会杀死父进程。有什么想法吗?
【问题讨论】:
-
我想单独为标题投票。
-
@TWhite:我的反应正好相反。
-
查看
kill(2)系统调用。 -
@TWhite 这很令人不安,你会认为这很有趣。
-
@self 幽默并不在于小孩子的死亡。幽默在于滚动浏览 SO 问题的标题并找到杀死剩余的孩子并被提醒,“哦,是的,分叉和杀死子进程。我有时有一种黑色幽默感,在阅读标题和问题后内部轻笑。