一尘不染

跟踪子进程的死亡

linux

在不让父进程等待子进程被杀死的情况下,我如何跟踪子进程的死亡?

我正在尝试一个客户端-服务器方案,其中服务器从客户端接受连接,并为它接受的每个连接派生一个新进程。

我忽略了SIGCHLD信号以防止僵尸创建。

signal(SIGCHLD, SIG_IGN);
while(1)
{
  accept();
  clients++;
  if(fork() ==0)
  {
     childfunction();
     clients--;
  }
  else
  {
  }
}

上述情况下的问题是,如果子进程在childfunction()函数中被杀死,则全局变量clients不会递减。

注意: 我正在寻找不使用SIGCHLD信号的解决方案…如果可能


阅读 213

收藏
2020-06-07

共1个答案

一尘不染

通常,您编写一个SIGCHLD调用waitpid()pid 的处理程序-1。您可以使用返回值确定pid死了多少。例如:

void my_sigchld_handler(int sig)
{
    pid_t p;
    int status;

    while ((p=waitpid(-1, &status, WNOHANG)) != -1)
    {
       /* Handle the death of pid p */
    }
}

/* It's better to use sigaction() over signal().  You won't run into the
 * issue where BSD signal() acts one way and Linux or SysV acts another. */

struct sigaction sa;

memset(&sa, 0, sizeof(sa));
sa.sa_handler = my_sigchld_handler;

sigaction(SIGCHLD, &sa, NULL);

或者,您可以waitpid(pid, &status, 0)使用指定的子进程ID进行调用,并同步等待其终止。或用于WNOHANG检查其状态而不会阻塞。

2020-06-07