C++ 一旦子进程执行完毕,就杀死它(在fork之后)

C++ 一旦子进程执行完毕,就杀死它(在fork之后),c++,C++,我正在编写一个简单的web服务器。简化形式的程序如下所示 while(1) { // accepting the connection. accept(); pid = fork(); if(pid == 0) { // performing some operations _exit(EXIT_SUCCESS); } else { sleep(1); }

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

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

     pid = fork();

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

     } else {

          sleep(1);
     }
}
因此,一旦子进程执行,它应该终止,父进程应该继续接受连接。但是,对我来说,子进程并没有被终止,甚至itchild也在接受连接。我在这里犯了什么错误吗

我可以看到进程中的孩子没有被杀死使用

top -U <username>

我需要帮助。提前谢谢

父进程必须调用才能获取子进程


您需要等待子进程的原因是,在某个进程退出后,仍有资源可用于子进程的退出代码。wait及其同级系统调用所做的不仅仅是等待子进程结束,还需要获取退出代码,以便操作系统能够正确清理子进程。如果父进程在退出之前没有等待所有子进程退出,则所有子进程都将成为孤立进程,并且进程id为1的进程将被设置为其父进程。

父进程必须调用以获取子进程


您需要等待子进程的原因是,在某个进程退出后,仍有资源可用于子进程的退出代码。wait及其同级系统调用所做的不仅仅是等待子进程结束,还需要获取退出代码,以便操作系统能够正确清理子进程。如果父进程在退出之前没有等待所有子进程退出,则所有子进程都将成为孤立进程,并且进程id为1的进程将被设置为其父进程。

首先感谢大家帮助我。我的密码有误

问题是在接受连接和分叉之后,在子进程中,我使用accept方法中使用的文件描述符关闭套接字连接,如

accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
然后应该在子进程内调用closesockfd。因为它在子进程中没有关闭,所以套接字对于accept连接是活动的。因此,尽管如此_exit已给定,但子进程在关联的套接字文件描述符关闭之前不会终止


在父进程中,我们还可以调用wait或waitpid,这取决于您需要从进程表中删除子进程并避免其僵化状态

首先感谢大家帮助我。我的密码有误

问题是在接受连接和分叉之后,在子进程中,我使用accept方法中使用的文件描述符关闭套接字连接,如

accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
然后应该在子进程内调用closesockfd。因为它在子进程中没有关闭,所以套接字对于accept连接是活动的。因此,尽管如此_exit已给定,但子进程在关联的套接字文件描述符关闭之前不会终止


在父进程中,我们还可以调用wait或waitpid,这取决于您需要从进程表中删除子进程并避免其僵化状态

所以我需要等待子进程终止,然后只允许父进程接受新连接?@Chaitanya Yes。但是,还有其他函数,如waitpid,也可以在链接中使用,它不会像普通等待那样阻止父进程。阅读手册页面了解如何进行非阻塞调用。虽然收割子进程很有用,但为什么不这样做会导致问题中提出的问题?@Joachim Ok,在这种情况下,使用非阻塞调用将是更好的选择。但是,我不明白为什么一旦fork和fork都是独立的过程,我们就应该等待,对吗?实际上,子进程应该只关心它的工作并终止,父进程应该继续。我的理解正确吗?@Chaitanya如果孩子调用了exit或从其主函数返回,那么它不会运行。但它仍在进程表中,处于僵尸状态。所以我需要等待子进程终止,然后只允许父进程接受新连接?@Chaitanya是的。但是,还有其他函数,如waitpid,也可以在链接中使用,它不会像普通等待那样阻止父进程。阅读手册页面了解如何进行非阻塞调用。虽然收割子进程很有用,但为什么不这样做会导致问题中提出的问题?@Joachim Ok,在这种情况下,使用非阻塞调用将是更好的选择。但是,我不明白为什么一旦fork和fork都是独立的过程,我们就应该等待,对吗?实际上,子进程应该只关心它的工作并终止,父进程应该继续。我的理解正确吗?@Chaitanya,如果孩子打电话退出或从学校回来
主功能,它没有运行。但它仍在进程表中,处于僵化状态。是否确实要为每个连接生成一个新进程?对于web服务器,我建议使用非阻塞I/O,例如libev或libuv。@Aardvark是的,我正在为每个连接生成一个新进程。确实要为每个连接生成一个新进程吗?对于web服务器,我建议使用非阻塞I/O,例如libev或libuv。@Aardvark是的,我正在为每个连接生成一个新进程。。