我对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 <sys/prctl.h>时,cygwin说它找不到文件或目录,我不知道为它安装什么包。另外,如果我的prctl()函数正常工作,会杀死所有的僵尸吗?
我的程序是一个客户端服务器,我的服务器使用fork()来处理每个客户端。当服务器关闭时,我应该不留下任何剩余的僵尸。
发布于 2012-09-15 00:09:11
您需要跟踪您的进程有多少子进程,然后调用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--;
}
}
}https://stackoverflow.com/questions/12427524
复制相似问题