杀子的父进程退出进程(killing child processes at parent proce

2019-09-22 11:25发布

我很新的C和编程,需要一些帮助。 在Linux下C(Cygwin的),我需要在出口删除所有子进程。 我已经看过其他类似的问题,但不能让它开始工作。 我试过了-

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退出。

我也有tried-

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

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

但因为我使用Cygwin的,当我#include <sys/prctl.h> ,cygwin的说,它无法找到文件或目录,我不知道要安装什么包吧。 另外,如果我prctl()函数是工作,会杀死所有僵尸?

我的计划是一个客户端服务器和我的服务器叉()来处理每一个客户。 我想,当服务器关闭时没有留下任何剩余的僵尸。

Answer 1:

从Linux文档atexit(3)

使用注册的功能atexit()on_exit(3)如果一个进程异常终止,因为信号的传递的不叫。

如果当你的应用程序收到SIGINT或SIGTERM要清理,你需要安装相应的信号处理程序,并做你的工作出现。



Answer 2:

waitpid不提供一般的参数,我很惊讶,它不会崩溃。 原型为:

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

第二个参数应该是一个指向 int ,你提供一个int 。 还要注意的是,你应该调用waitpid每个孩子,你只称这是一个。

atexit()如果你退出通常只调用。 如果您是通过CTRL + C退出,那么你需要从SIGINT处理程序中调用函数。



Answer 3:

你需要让你的过程中有多少个子轨道,然后调用等那么多次。 此外,正如其他人所说,你的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--;
        }
    }
}


文章来源: killing child processes at parent process exit