我正在编写一个简单的Web服务器。简化形式的程序如下
while(1)
{
// accepting the connection.
accept();
pid = fork();
if(pid == 0)
{
// performing some operations
_exit(EXIT_SUCCESS);
} else {
sleep(1);
}
}
因此,一旦子进程执行,它应该终止,并且父进程应该继续接受连接。但是,对我来说,子进程不会被终止,甚至它(子)也接受连接。我在这里犯了什么错误。
我能够看到进程(孩子)没有被杀死。
top -U <username>
我需要帮助。提前致谢。 :)
答案 0 :(得分:3)
父进程必须调用wait
来“收获”子进程。
您需要“等待”孩子的原因是因为在进程退出后仍有剩余资源用于子进程的退出代码。 wait
(及其兄弟系统调用)正在做的不仅是等待子进程结束,而且还获取退出代码,以便操作系统可以正确地清理子进程。如果父进程在自身退出之前没有等待所有子进程退出,则所有子进程都将变为孤立进程,并且进程标识为1
的进程将设置为其父进程。
答案 1 :(得分:1)
首先感谢大家帮助我。我在代码中犯了错误。 :)
问题是在接受连接和分叉之后,在子进程中我使用接受方法中使用的文件描述符{/ 1}}来获取close()
accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
然后应该在子进程中调用close(sockfd)
。因为,它没有在子进程中关闭,所以accept()
连接的套接字处于活动状态。因此,尽管如此,_exit()
被赋予子进程在相关的套接字文件描述符关闭之前不会被终止。
在父进程中我们必须调用wait()
或waitpid()
,这取决于您是否需要从进程表中删除子进程并避免其僵尸状态。