【问题标题】:Forcing child processes to quit after a fork分叉后强制子进程退出
【发布时间】: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 问题的标题并找到杀死剩余的孩子并被提醒,“哦,是的,分叉和杀死子进程。我有时有一种黑色幽默感,在阅读标题和问题后内部轻笑。

标签: c linux


【解决方案1】:

您可以使用kill() 和一个计时器在指定的时间间隔后发送它。

int kill(pid_t pid, int sig);

例如:kill(0,SIGTERM);

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

【讨论】:

  • 使用它实际上关闭了我的电脑。
猜你喜欢
  • 2015-12-12
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多