首页 > 解决方案 > 使用带有大量子进程的 waitpid() 的问题

问题描述

我有 ac 程序来创建 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. */
}

但这引发了另一个问题,因为父进程总是挂起并等待连接,所以总是有一个或两个先前完成的子进程无法清理,直到父进程可以分叉另一个并清理它们

即使我的程序在退出前收到信号中断后可以清理每个僵尸,但我希望它自己清理每个完成的孩子。

请帮我解决这个问题,谢谢。如果我有任何不明白的地方,请发表评论,以便我解释。

标签: clinuxsockets

解决方案


您可以做的最好的事情是让父母在accept(2)呼叫循环中等待,接受客户端的传入连接并派生孩子参加连接。为信号注册一个信号处理程序,该信号处理程序SIGCHLD只是进行wait(2)调用并将退出代码排队到某个队列中,以便父进程在有时间时进行处理。例如,父级可以接受一个连接,派生一个子级,并处理中断处理程序排队的所有退出代码以清理子级数据。之后,它回来accept(2)欢迎新客户。


推荐阅读