来源:https://blog.csdn.net/guotao1983/article/details/82118218

signal(SIGCHLD, SIG_IGN)

因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源。如果将此信号的处理方式设为忽略,可让内核把僵尸子进程转交给init进程去处理,省去了大量僵尸进程占用系统资源。(Linux Only)

对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。在Linux下可以简单地将 SIGCHLD信号的操作设为SIG_IGN。

signal(SIGPIPE, SIG_IGN)

TCP是全双工的信道,可以看作两条单工信道, TCP连接两端的两个端点各负责一条。 当对端调用close时, 虽然本意是关闭整个两条信道,但本端只是收到FIN包. 按照TCP协议的语义,表示对端只是关闭了其所负责的那一条单工信道, 仍然可以继续接收数据。 也就是说, 因为TCP协议的限制, 一个端点无法获知对端的socket是调用了close还是shutdown。

对一个已经收到FIN包的socket调用read方法,如果接收缓冲已空,则返回0, 这就是常说的表示连接关闭。但第一次对其调用write方法时, 如果发送缓冲没问题,会返回正确写入(发送)。但发送的报文会导致对端发送RST报文,因为对端的socket已经调用了close,完全关闭, 既不发送,也不接收数据。所以, 第二次调用write方法(假设在收到RST之后),会生成SIGPIPE信号,导致进程退出。为了避免进程退出, 可以捕获SIGPIPE信号,或者忽略它, 给它设置SIG_IGN信号处理函数:

signal(SIGPIPE, SIG_IGN)

这样, 第二次调用write方法时,会返回-1, 同时errno置为SIGPIPE, 程序便能知道对端已经关闭。

最新文章

  1. BZOJ 2093: [Poi2010]Frog
  2. Alpha版本十天冲刺——Day 10
  3. [CareerCup] 10.6 Find Duplicate URLs 找重复的URL链接
  4. python二维数组
  5. Spring(3.2.3) - Beans(11): depends-on
  6. 【原创】深度神经网络(Deep Neural Network, DNN)
  7. easyui tree在struts1中的使用
  8. Dom4j 学习笔记
  9. window7电脑设置好了,却无法远程?
  10. SpringMVC 学习-异常处理 SimpleMappingExceptionResolver 类
  11. 牛顿迭代法解指数方程(aX + e^x解 = b )
  12. 程序点滴001_Python模拟点阵数字
  13. oracle通用函数,nvl,nvl2,NULLIF ,coalesce
  14. [2017-7-28]Android Learning Day6
  15. python url 下载并保存
  16. 用图片作为label,for属性IE下不起作用
  17. mybatis中查询使用#{}和${}的区别
  18. C# 反射的深入了解
  19. gson转换对象为json字符串时对特殊字符编码的问题
  20. why pure virtual function has definition 为什么可以在基类中实现纯虚函数

热门文章

  1. 设置Linux主机SSH访问服务
  2. 利用 sklearn 生成交叉特征:
  3. 创建django报错使用miniconda
  4. git工作中总结
  5. 3.JavaSE之注释
  6. .net core webapi搭建(2)跨域
  7. 个人任务day4
  8. 使用Azure CLI创建Linux虚拟机
  9. MYGUI3.2改造——完善windows下的文字显示
  10. 三句话搞定FireDAC连接池