在不让父进程等待子进程被杀死的情况下,我如何跟踪子进程的死亡?
我正在尝试一个客户端-服务器方案,其中服务器从客户端接受连接,并为它接受的每个连接派生一个新进程。
我忽略了SIGCHLD信号以防止僵尸创建。
signal(SIGCHLD, SIG_IGN); while(1) { accept(); clients++; if(fork() ==0) { childfunction(); clients--; } else { } }
上述情况下的问题是,如果子进程在childfunction()函数中被杀死,则全局变量clients不会递减。
childfunction()
clients
注意: 我正在寻找不使用SIGCHLD信号的解决方案…如果可能
通常,您编写一个SIGCHLD调用waitpid()pid 的处理程序-1。您可以使用返回值确定pid死了多少。例如:
SIGCHLD
waitpid()
-1
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检查其状态而不会阻塞。
waitpid(pid, &status, 0)
WNOHANG