2

我正在编写一个简单的 Web 服务器。简化形式的程序如下

while(1)
{
     // accepting the connection.
     accept();

     pid = fork();

     if(pid == 0)
     { 
          // performing some operations
          _exit(EXIT_SUCCESS);

     } else {

          sleep(1);
     }
}

所以一旦子进程执行它应该终止,并且父进程应该继续接受连接。但是,对我来说,子进程并没有被终止,甚至它(子)也在接受连接。我在这里做错了吗。

我能够看到进程(子)没有被使用。

top -U <username>

我需要这方面的帮助。提前致谢。:)

4

2 回答 2

3

父进程必须调用wait才能“收割”子进程。

您需要为子进程“等待”的原因是因为在进程退出后仍有资源剩余,用于子进程的退出代码。(及其兄弟系统调用)正在做wait的不仅是等待子进程结束,而且还要获取退出代码,以便操作系统可以正确清理子进程。如果父进程在自己退出之前没有等待所有子进程退出,那么所有子进程都将成为孤立进程,并且将具有进程 id 的进程1设置为它们的父进程。

于 2012-11-27T12:57:09.863 回答
1

首先感谢大家帮助我。我的代码中有错误。:)

问题是在接受连接和分叉后,在子进程中我close()使用接受方法中使用的文件描述符到达套接字连接,例如

accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

thenclose(sockfd)应该在子进程中调用。由于它没有在子进程中关闭,因此套接字对于accept()连接是活动的。因此,尽管如此_exit(),在关联的套接字文件描述符关闭之前,子进程不会被终止。

在我们必须调用的父进程中,wait()或者waitpid()根据您需要从进程表中删除子进程并避免其僵尸状态。

于 2012-11-28T12:38:37.343 回答