服务器端处理多进程常见问题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这个挺有用,
有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这个挺有用,
相关文章推荐
- JDBC保存和读取大文本数据类型
- Cocos2d-x 3.x 图形学渲染系列二十六
- Cocos2d-x 3.x 图形学渲染系列二十六
- CVPR 2017-01-24
- 简单梳理web盲区(-)OSI和TCP/IP模型
- [置顶] ACM 生涯指导 总结
- 3438: 小M的作物
- CVPR 2017-01-23
- 【九度OJ】- 1014
- 一步步搞定自定义VIEW(一)
- CODE[VS] 1287 矩阵乘法
- 1280: Emmy卖猪pigs
- 祝CSDN的朋友们新年快乐
- POJ 1584 A Round Peg in a Ground Hole[判断凸包 点在多边形内]
- Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索——参考资料
- Java基础教程之理解Annotation详细介绍
- C++中除号和百分号的区别,这个在进位计算里常用
- FFT系列 复数
- 共同学习Java源代码-数据结构-Map接口
- 设计模式(3) ------- 抽象方法模式