僵尸进程删除无需等待C.

Ale*_*ray 6 c unix linux

我有一个孩子的过程exit(0).它变成了僵尸.有没有办法在没有waitwaitpid在父进程中删除它?

R+  ./server //parent
R+  ./server //child
Z+  (server) //child zombie 
Run Code Online (Sandbox Code Playgroud)

Bas*_*tch 7

你可以捕获SIGCHLD信号(例如使用sigaction(2)等...).注意,很少有函数可以从信号处理程序安全地调用.多次读取信号(7)信号安全(7).在信号处理程序中做一件好事就是设置一些volatile sigatomic_t标志(稍后将在信号处理程序之外进行测试,例如在某些事件循环中).或者你可以在初始化时设置一个管道(7)(到你自己的进程)并在你的信号处理程序中写几个字节(并在其他地方轮询(2)读取结束),如Qt建议的那样.

waitpid(2)可以被告知不要停下来WNOHANG

如果你从不等待孩子的过程,它将变成僵尸.

阅读高级Linux编程.它有一个关于流程的好章节.


hyd*_*yde 6

最简单的方法是在父级中忽略SIGCHLD:

signal(SIGCHLD, SIG_IGN);
Run Code Online (Sandbox Code Playgroud)

在那之后,退出子进程将干净利落地离开,而不需要等待.

注意:这是一种快速而肮脏的方法,并假设您根本不关心子进程的退出状态,或者它何时退出.如果你真的关心,你可能应该在一个真正强大的应用程序中,那么请参阅另一个答案,关于创建一个正确的信号处理函数.

另外:这在Unix中并不普遍,但至少在Linux上有效.根据UNIX FAQ,它是POSIX中未定义的行为.这个Mac OS X手册页表明这种行为是在FreeBSD 5.0中引入的,例如可以在OS X上运行.