[英]killing a child process (after fork) once its execution is done
我正在编写一个简单的Web服务器。 程序的简化形式如下
while(1)
{
// accepting the connection.
accept();
pid = fork();
if(pid == 0)
{
// performing some operations
_exit(EXIT_SUCCESS);
} else {
sleep(1);
}
}
因此,一旦子进程执行,它便应终止,而父进程应继续接受连接。 但是,对我来说,子进程不会终止,甚至它(子进程)也接受连接。 我在这里犯任何错误吗?
我能够看到该进程(子进程)没有被杀死。
top -U <username>
我需要帮助。 提前致谢。 :)
父进程必须调用wait
以“收获”子进程。
您需要“等待”子进程的原因是因为在退出进程后,仍然存在用于子进程的退出代码的资源。 wait
(及其同级系统调用)所做的不仅是等待子进程结束,还获得退出代码,以便操作系统可以正确清理子进程。 如果父进程在退出之前不等待所有子进程退出,则所有子进程将变为孤立进程,并将进程ID为1
的进程设置为其父进程。
首先,感谢大家对我的帮助。 我的代码有误。 :)
问题出在接受连接和分支之后,在子进程中,我使用诸如accept方法之类的文件描述符close()
了socket连接。
accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
然后应该在子进程中调用close(sockfd)
。 由于未在子进程中关闭该套接字,因此该套接字仍在accept()
连接。 因此,尽管如此,在关闭关联的套接字文件描述符之前,不会给_exit()
子进程终止。
与此相关,在父进程中,我们必须调用wait()
或waitpid()
具体取决于您需要从进程表中删除子进程并避免其僵尸状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.