您的位置:首页 > 其它

服务器端处理多进程常见问题01

2017-01-28 11:39 197 查看
传智扫地僧课程学习笔记。

有3个进程,

服务器的监听进程,信息处理进程,

客户端的连接进程,

服务器子进程直接死了,父进程没有机会调用waitpid()函数进行处理,服务器产生僵尸进程,

方法1,忽略信号,但是一般不采用,signal(SIGCHLD, SIG_IGN);

方法2,注册信号,signal(SIGCHLD, handle_sigchld);  handle_sigchld内部调用wait(NULL);

补充说下,你有没有发现CHLD有点像单词孩子的缩写,

上面的问题暂时解决了,

可是如果有五个子进程,同时结束,

那所发送的SIGCHLD同时发出,

不过由于SIGCHLD是不可靠信号,因此父进程能可能收到1~5个信号,不确定,

实验结果是,客户端发起了5个连接,结果杀死客户端的时候,天啊,服务器程序产生4个僵尸进程,

解决方法是,自然醒,还记得吗?哈哈

void handle_sigchld(int sig)
{
int mypid = 0;
//wait();以后就按下面的来做,不要用这种,
while ( (mypid=waitpid(-1, NULL, WNOHANG)) >0 )
{
printf("孩子退出,父进程要收尸:%d \n", mypid);
}
}WNOHANG这个挺有用,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: