第五章中,有一个例子模拟客户端并发的终止TCP连接,服务器捕捉并处理SIGCHLD信号并调用waitpid函数防止僵死进程的出现。信号处理函数中核心的一句是:

     while ( (pid = waitpid(-, &statloc, WNOHANG)) >  )
{
printf("wait child pid:%ld\n",(long)pid);
}

  这是在使用wait函数时不能解决N个子进程同时终止时导致只有1个子进程被wait而其他N-1个子进程变成僵死进程的问题而采用的改进方法,使用wait的信号处理函数

 pid = wait(&statloc);

  什么是僵死进程?

    僵死进程就是,进程本身退出了,而它的父进程未退出,并且父进程没有对它进行wait类处理,导致进程占有的资源,例如进程pid,记录进程信息的结构没有被释放,进程进入僵死态,这样的进程就叫僵死进程。

  僵死进程的危害

    一旦僵死进程累积,比如有一个长期运行的程序不断的产生僵死进程,那么最终会耗尽系统可用的pid和内存,这样就无法创建新的进程了。就算未耗尽这些,过多的僵死进程对内存的消耗也会影响机器的性能。

  如何防止僵死进程的出现?

    父进程在调用wait类函数时,就可以释放子进程的资源,子进程就不会变成僵死进程。通常都是通过捕捉SIGCHLD信号,在信号处理函数里面调用wait类函数。

  先man下wait和waitpid

       #include <sys/types.h>
#include <sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options);

  wait:

    函数阻塞,直到任意一个子进程终止,或者被一个信号中断。终止的这个子进程的退出状态返回存储在参数 status的低位字节,返回值为结束的子进程pid。

  waitpid:

    根据pid和options做出不同的响应。

    pid > 0,wait进程id为pid的子进程

    pid = 0,wait进程组id为调用进程ID的任意一个子进程

    pid = -1,wait任意一个子进程

    pid < -1, wait 进程组id为|pid|的任意一个子进程

  而options又提供不同的选项,它可以为0或者一个或多个选项的or组合

    WNOHANG

       当未发现有任何子进程退出时立即返回。

    WUNTRACED

    WCONTINUED

  

  由于linux信号机制是不进行排队的,所以对于同时发出的多个信号,信号处理程序最多捕捉2次,而wait函数每次最多处理一个子进程,所以,当同时结束的子进程超过2个后,必然会出现僵死进程。那么为什么  while ( (pid = waitpid(-, &statloc, WNOHANG)) > ) 可以解决这个问题呢?

  假设有5个子进程,p1,p2....p5,首先p1,p2结束,捕获到信号,上面的while+waitpid语句将一次性把所有已结束的子进程处理完毕,此时仍有3个子进程未结束,那么waitpid返回0,退出循环,如果在处理函数调用期间,又有一个p3结束,等到处理函数返回时,马上又捕捉到了信号,再次进入处理函数对p3进行处理,这样一来不管子进程是在处理函数处理期间结束还是之前之后结束,信号都能被捕捉,不管结束的是1个子进程还是多个子进程,每个都能被waitpid处理,这样就不再会有僵死进程出现了。

  为什么是用 while ( (pid = waitpid(-, &statloc, WNOHANG)) > ) ,而不是 '>= 0'??等于0是指仍然存在运行的子进程,但是子进程未结束,如果使用>=0,那么只要有一个子进程未结束,处理函数将在while中循环,这样父进程将不能被执行,所以不采用 >=。

  一直对于采用while+waitpid为什么能防止僵死进程出现存在不解,其根本原因在于我认为一旦信号丢失,那么与之对于的那个子进程也将不会被waitpid处理。其实信号在这里只是起一个通知作用,比如,我可以在父进程里面采用轮询waitpid,不用信号处理函数也能wait所有结束的子进程。我一个小时前结束了一个子进程,一个小时后才用waitpid来处理,照样可以让这个处于僵死态的子进程得到正确的处理。

  关于以上问题的讨论http://bbs.chinaunix.net/thread-828942-1-1.html这个帖子做了比较好的解释。

unp TCP 客户端服务器回射程序中对SIGCHLD信号的处理的更多相关文章

  1. linux支持并发的服务器回射程序实例

    实例一:不支持并发,单服务器---单客户端 /************************************************************************* > ...

  2. 第十篇:基于TCP的一对回射客户/服务器程序及其运行过程分析( 上 )

    前言 本文将讲解一对经典的客户/服务器回射程序,感受网络编程的大致框架( 该程序稍作改装即可演变成各种提供其他服务的程序 ):同时,还将对其运行过程加以分析,观察程序背后协议的执行细节,学习调试网络程 ...

  3. 第十一篇:基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )

    执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. ...

  4. 基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )

    执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. ...

  5. Socket 入门- 客户端回射程序

    结果输出:------------------------------------------------------客户端:xx@xxxxxx:~/Public/C$ ./postBackCli.o ...

  6. 可以创建专业的客户端/服务器视频会议应用程序的音频和视频控件LEADTOOLS Video Conferencing SDK

    LEADTOOLS Video Streaming Module控件为您创建一个自定义的视频会议应用程序和工具提供所有需要的功能.软件开发人员可以使用Video Streaming Module SD ...

  7. 系统编程-网络-tcp客户端服务器编程模型(续)、连接断开、获取连接状态场景

    相关博文: 系统编程-网络-tcp客户端服务器编程模型.socket.htons.inet_ntop等各API详解.使用telnet测试基本服务器功能 接着该上篇博文,咱们继续,首先,为了内容的完整性 ...

  8. TCP简单回射程序

    一.程序功能 (1)客户从标准输入读入一行文本行,并写给服务器: (2)服务器从网络输入读入这行文本,并回射给客户: (3)客户从网络输入读入这行回射文本,并显示在标准输出上 二.服务器程序 #inc ...

  9. 转载 Flask中客户端 - 服务器 - web应用程序 是如何处理request生成response的?

    文章转载自https://blog.csdn.net/weixin_37923128/article/details/80992645 , 感谢原作者 当客户端向服务器发送一个请求时,服务器会将请求转 ...

随机推荐

  1. Foreach原理

    本质:实现了一个IEnumerable接口, 01.为什么数组和集合可以使用foreach遍历? 解析:因为数组和集合都实现了IEnumerable接口,该接口中只有一个方法,GetEnumerato ...

  2. Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.

    遇到这个问题似然重启是个办法,但是真心好累.. 1.在dos下,输入  netstat   -ano|findstr  8080 //说明:查看占用8080端口的进程 显示占用端口的进程 2.在任务管 ...

  3. 学习hadoop遇到的问题

    1.运行hadoop的帐号,需要多大的权限? 之前实验用的帐号是root,后来新建了个普通帐号,发觉不能直接套用到已经建立好的hadoop系统,因为无权限,即使将普通帐号加入到root群组仍然存在异常 ...

  4. JSON.NET 使用技巧

    1. 序列化相关技巧 通过特性忽略某些属性 有时候我们会有这样的需求,我们只需要序列化实体类中的一部分属性,这时候我们可以通过声明忽略掉一些我们不需要序列化的属性,有两种方式可以使用么达到这个目标: ...

  5. css知多少(9)——float下篇

    float内容比较多,咱们分上.下两篇来介绍,上篇已经写完,这是下篇.建议大家先把上篇看了,再来看下文,精彩内容不要掠过啊. 1. 清除float <上篇>中我们提到,float具有“破坏 ...

  6. Debug - 支持浏览器和 Node 平台的全端调试工具

    Debug 是一个跟踪调试消息的 JavaScript 库.因为它只是对 console.log 的包装,所以支持 Node 和浏览器.它允许你过滤日志输出而不需要改变你的源代码,也输出时间差异,可以 ...

  7. Echo.js – 简单易用的 JavaScript 图片延迟加载插件

    Echo.js 是一个独立的延迟加载图片的 JavaScript 插件.Echo.js 不依赖第三方库,压缩后不到1KB大小. 延迟加载是提高网页首屏显示速度的一种很有效的方法,当图片元素进入窗口可视 ...

  8. 【服务器】CentOS下部署运行NodeJs Web App

    NodeJs Web App测试完成后,要怎么部署呢?介绍两个不错的方案 已知以下情景: 我要为 「kenniu」这个项目做配置 它的入口文件在 「/path/to/entry.js」 运行的User ...

  9. div,span,p等转换成可编辑

    当前它能够将任意不可编辑的标签(span.div.p...等)转换成可编辑的text input.password.textarea.下拉列表(drop-down list)等标签.你可以利用它的ed ...

  10. iOS 适配iOS9

    1.网络接口不支持https协议,在iOS9下 在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据. 解决方案(以下方法2选1): (1)暂时退回到http协议 ...