首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在父进程退出时删除子进程

在父进程退出时删除子进程
EN

Stack Overflow用户
提问于 2012-09-14 23:24:35
回答 3查看 7.1K关注 0票数 2

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

代码语言:javascript
运行
复制
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退出。

我也试过了-

代码语言:javascript
运行
复制
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()来处理每个客户端。当服务器关闭时,我应该不留下任何剩余的僵尸。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-14 23:33:24

来自atexit(3)的Linux文档

如果进程由于信号的传递而异常终止,则不会调用使用atexit() (和on_exit(3))注册的

函数。

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

票数 0
EN

Stack Overflow用户

发布于 2012-09-14 23:37:42

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

代码语言:javascript
运行
复制
pid_t waitpid(pid_t pid, int *status, int options); 

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-15 00:09:11

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

代码语言:javascript
运行
复制
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--;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12427524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档