我对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退出。
我也尝试过 –
prctl(PR_SET_PDEATHSIG, SIGHUP); //in child process signal(SIGHUP, killMe); void killMe() { printf("works"); exit(1); }
但是因为我正在使用cygwin,当我#include
,cygwin说它找不到文件或目录,我不知道要为它安装什么包。 此外,如果我的prctl()
函数工作,会杀死所有的僵尸吗?
我的程序是客户端服务器,我的服务器forks()来处理每个客户端。 我想在服务器关闭时不留下任何剩余的僵尸。
从atexit(3)
的Linux文档atexit(3)
:
如果进程由于传递信号而exception终止,则不会调用使用
atexit()
(和on_exit(3)
)注册的函数。
如果要在应用程序收到SIGINT或SIGTERM时进行清理,则需要安装相应的信号处理程序并在那里进行工作。
你的waitpid
没有提供通常的参数,我很惊讶它没有崩溃。 原型是:
pid_t waitpid(pid_t pid, int *status, int options);
第二个参数应该是指向 int
的指针 ,您提供的是int
。 另请注意,您应该为每个孩子调用waitpid
,而您只调用一个孩子。
只有在正常退出时才会调用atexit()
。 如果您通过CTRL + C退出,那么您需要从SIGINT上的处理程序调用您的函数。
您需要跟踪您的进程有多少子进程,然后多次调用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--; } } }
以上就是c/c++开发分享在父进程退出时终止子进程相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559646.html