- 论坛徽章:
- 0
|
waitpid问题
对楼主的问题弟二个问题,最后简要解释一下,这个消息处理函数的使用场景(出自Richar Steven的UNP):
void sig_chld(int signo)
{
pid_t pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) >; 0)
printf("child %d terminated\n", pid);
return;
}
服务器端父进程的主循环每次为新到来的客户创建一个新的进程之后,会再次阻塞在accept, 一般来说,这个循环"永远"不会退出.
int main()
{
....
for(; {
newsock = accept(listener,......)
...
}
....
}
如果某个处理客户连接的子进程结束, 会向父进程发出SIGCHLD信号, 这个信号会中断父进程的accpet系统调用 (注意,这个中断是不可回复的). 所以Signal(SIGCHLD, sig_chld);告诉父进程收到SIGCHLD信号后进入sig_chld函数对结束的这个子进程进行处理. 但是如果waitpid采用阻塞方式(没有WNOHANG), 或者循环捕捉的话, 整个程序会阻塞在sig_chld函数中,使得服务器的父进程无法对新的客户进行处理. |
|