【问题标题】:killing child processes at parent process exit在父进程退出时杀死子进程
【发布时间】:2012-09-14 15:24:34
【问题描述】:

我对 c 和编程非常陌生,需要一些帮助。在 linux(cygwin) 上的 c 中,我需要在退出时删除所有子进程。我已经查看了其他类似的问题,但无法使其正常工作。我试过了-

atexit(killzombies); //in parent process

void killzombies(void)
{
    printf("works");
    kill(0, SIGTERM);
    printf("works");
    if (waitpid(-1, SIGCHLD, WNOHANG) < 0)
         printf("works");
}

出于某种原因,“作品”甚至不会打印出来。我按 ctrl + c 退出。

我也试过了-

prctl(PR_SET_PDEATHSIG, SIGHUP); //in child process
signal(SIGHUP, killMe);

void killMe()
{
    printf("works");
    exit(1);
}

但是因为我使用的是cygwin,所以当我#include &lt;sys/prctl.h&gt; 时,cygwin 说它找不到文件或目录,我不知道要为它安装什么包。 另外,如果我的prctl() 函数起作用了,会杀死所有的僵尸吗?

我的程序是一个客户端服务器,我的服务器 forks() 来处理每个客户端。我想当服务器关闭时不会留下任何剩余的僵尸。

【问题讨论】:

标签: c parent-child kill zombie-process atexit


【解决方案1】:

您的waitpid 没有提供通常的参数,我很惊讶它没有崩溃。原型是:

pid_t waitpid(pid_t pid, int *status, int options); 

第二个参数应该是指向int指针,您提供的是int。 另请注意,您应该为 每个 个孩子调用 waitpid,您只是为一个孩子调用它。

atexit() 只有在正常退出时才会调用。如果您通过 CTRL+C 退出,那么您需要从 SIGINT 上的处理程序调用您的函数。

【讨论】:

    【解决方案2】:

    来自atexit(3)的Linux文档:

    使用atexit()(和on_exit(3))注册的函数不会被调用,如果 一个进程因为一个信号的传递而异常终止。

    如果您想在您的应用程序收到 SIGINT 或 SIGTERM 时进行清理,您需要安装适当的信号处理程序并在那里完成您的工作。

    【讨论】:

      【解决方案3】:

      您需要跟踪您的进程有多少个子进程,然后多次调用 wait 。此外,正如其他人所说,如果进程被信号终止,则不会调用您的 atexit() 函数,因此您还需要从信号处理程序中调用 killzombies() 。你需要类似的东西:

      int n_children = 0; // global
      
      void handle_sig(int sig) {
          killzombies();
          exit(sig);
      }
      
      // your atexit()
      void killzombies() {
          kill(0, SIGKILL);
          while (n_children > 0) {
              if (wait(NULL) != -1) {
                  n_children--;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-17
        • 2018-10-14
        • 1970-01-01
        • 2011-09-09
        • 1970-01-01
        相关资源
        最近更新 更多