C语言 问题使用waitpid()与大量的子进程



我有一个c程序来创建一个TCP套接字,并在无限循环中等待连接。每次客户机连接到程序时,我都会生成一个新的子进程来处理客户机请求。我的程序只能在信号中断(例如ctrl+c)时退出。

我不希望父进程挂在那里等待子进程,我希望它们可以同时工作。父进程在分叉后应该做的是检查是否有子进程已经完成,如果是,清理它们.

目前我的方法是(没有错误检查在这里节省空间,有很多错误检查在我的实际代码):

if (fork()==0){
/* Child process. */
}
else{
close(client);    /* <- Cut down the connection from parent with the client. */
waitpid(0, &status_exit, WNOHANG|WUNTRACED);
child_spawn++;    /* One parent int variable to count total number of child process. */
}

但是这引起了另一个问题,因为父进程总是挂起并等待连接,所以总是有一个或两个先前完成的子进程不能被清除,直到父进程可以派生另一个并清除它们.

即使我的程序在退出前接收到中断信号时可以清理所有僵尸,但我希望它自己清理所有已完成的子进程。

请帮我一下,谢谢。如果我有任何不清楚的地方,请留下评论,以便我解释。

您能做的最好的事情是让父进程在accept(2)调用的循环中等待,接受客户机的传入连接,并分叉子进程来参加这些连接。为SIGCHLD信号注册一个信号处理程序,它简单地发出一个wait(2)调用,并在某个队列上排队退出代码,以便父进程有时间处理。例如,父进程可以接受一个连接,派生一个子进程,并处理所有由中断处理程序排队的退出代码,以清除子进程的数据。之后,返回到accept(2),欢迎新客户端。

最新更新