我正在编写一个fork()
用于生成客户端连接处理程序的服务器。服务器不需要知道分叉的进程会发生什么——它们自己工作,当它们完成后,它们应该死掉而不是变成僵尸。有什么简单的方法可以做到这一点?
问问题
22520 次
3 回答
14
有几种方法,但在父进程中使用sigaction
with可能是最简单的一种:SA_NOCLDWAIT
struct sigaction sigchld_action = {
.sa_handler = SIG_DFL,
.sa_flags = SA_NOCLDWAIT
};
sigaction(SIGCHLD, &sigchld_action, NULL);
于 2013-06-10T01:30:17.970 回答
6
使用双叉。让您的孩子立即 fork 另一个副本并退出原始子进程。
http://thinkiii.blogspot.com/2009/12/double-fork-to-avoid-zombie-process.html
在我看来,这比使用信号更简单,也更容易理解。
void safe_fork()
{
pid_t pid;
if (!pid=fork()) {
if (!fork()) {
/* this is the child that keeps going */
do_something(); /* or exec */
} else {
/* the first child process exits */
exit(0);
}
} else {
/* this is the original process */
/* wait for the first child to exit which it will immediately */
waitpid(pid);
}
}
于 2013-06-10T01:37:14.100 回答
0
如何摆脱僵尸进程?
当你杀死一个正常的进程时,你不能用 SIGKILL 信号杀死僵尸进程,因为僵尸进程不能接收任何信号。所以养成一个好习惯很重要。
那么在编程时,如何摆脱大量的僵尸进程呢?根据上面的描述,子进程死亡时会向父进程发送 SIGCHLD 信号。默认情况下,系统会忽略这个信号,所以最好的方法是我们可以在信号处理函数中调用wait(),这样可以避免僵尸在系统中徘徊。了解更多信息:http: //itsprite.com/how-to-deep-understand-the-zombie-process-in-linux/
于 2013-12-10T09:09:19.767 回答