繁体   English   中英

执行完后杀死一个子进程(在fork之后)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM