TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 
但本端只是收到FIN包.

按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道, 仍然可以继续接收数据. 也就是说, 因为TCP协议的限制, 
一个端点无法获知对端的socket是调用了close还是shutdown.

这句不太准确,虽然本端无法知道对端是close还是shutdown(S,SHUT_WR),但是如果对端是close并且socket描述符的使用计数减为0的话,

那么实际对端是关闭了两个信道。原因,实际下面已经讲了,对端如果close,相当于shutdow(S,SHUT_BOTH),本端如果再write的话,就会收到

RST的。

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

为了避免进程退出, 可以捕获SIGPIPE信号, 或者忽略它, 给它设置SIG_IGN信号处理函数:

signal(SIGPIPE, SIG_IGN);

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

总结:

实际这个函数的目的就是防止程序收到SIGPIPE后自动退出

signal(SIGPIPE, SIG_IGN);相关推荐

  1. signal(SIGCHLD, SIG_IGN) 和 signal(SIGPIPE, SIG_IGN) 使用场景

    一.signal(SIGCHLD, SIG_IGN); 因为并发服务器常常 fork 很多子进程,子进程终结之后需要服务器进程去 wait 清理资源.如果将此信号的处理方式设为忽略,可让内核把僵尸子进 ...

  2. signal(SIGPIPE, SIG_IGN)

    关于SIGPIPE导致的程序退出 当服务器close一个连接时,若client端接着发数据.根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIP ...

  3. signal(SIGCHLD, SIG_IGN)和signal(SIGPIPE, SIG_IGN);

    signal(SIGCHLD, SIG_IGN); 因为并发服务器常常fork很多子进程,子进程终结之后需要服务器进程去wait清理资源.如果将此信号的处理方式设为忽略,可让内核把僵尸子进程转交给in ...

  4. listen函数的第二个参数_signal(SIGPIPE,?SIG_IGN)listen函数中backlog参数分析

    signal(SIGPIPE, SIG_IGN); TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端 ...

  5. 在arm-linux上用gdb调试程序,出现“Program received signal SIGPIPE, Broken pipe”

    出现这种情况大多是因为程序采用CS架构(服务器/客户端)在读写操作时出现,我第一次也是在这样的情况下遇到的.首先我们都知道套接字的通信方式是双工的,同端即可写也可读.而出现Broken pipe这种情 ...

  6. signal(SIGHUP, SIG_IGN);

    signal(SIGHUP, SIG_IGN); 的理解 转载于:https://www.cnblogs.com/lanjiangzhou/p/10505653.html

  7. gdb调试时,Program received signal SIGPIPE, Broken pipe.

    今天在gdb调试时,发现总是出现Program received signal SIGPIPE, Broken pipe,搜索了网上的资料,发现是在调试时,接收到了SIGPIPE这个signal信号导 ...

  8. signal(SIGCHLD, SIG_IGN)

    python 中使用import signal就可以导入模块了 signal(参数一,参数二) 参数一:我们要进行处理的信号.系统的信号我们可以再终端键入 kill -l查看(共64个).其实这些信号 ...

  9. 什么是signal(SIGCHLD, SIG_IGN)函数

    什么是signal(SIGCHLD, SIG_IGN)函数 在进行网络编程时候遇到这个函数的使用,自己学习结果如下,有不对请帮忙指正:) signal(SIGCHLD, SIG_IGN) 打开manp ...

最新文章

  1. 《Groovy官方指南》翻译邀请
  2. 32.Docker安装MongoDb
  3. 对象 普通po转_厦门2020年转学怎么转?需要什么材料?你想知道的答案都在这!......
  4. 【C语言简介】C语言的前世今生
  5. 华中科技大学计算机系统基础实验3报告,华中科技大学计算机系统基础实验报告.doc...
  6. mysql的时间用什么存储_MySQL存储时间类型选择的问题讲解
  7. java获取两个字符串日期之间间隔的天数
  8. 字节跳动和OPPO:机器翻译等智能时代算法技术如何落地?
  9. IOS学习之路十(仿人人滑动菜单Slide-out Sidebar Menu)
  10. KST1G SD卡脚本提取JPG
  11. abd串口工具使用教程_一体机电脑维修工具下载及使用教程
  12. 从solidWorks导出机器人URDF文件
  13. 如何去掉图片上的logo
  14. android崩溃日志 2016,常用获取Android崩溃日志的几种方法
  15. noob学python #1
  16. ❀❀❀Excel加载项开发及发布❀❀❀
  17. 云计算成朝阳产业,未来发展已成趋势
  18. MATLAB 残差分析
  19. linux eclipse glib.h,eclipse Glib
  20. 大部分有高学历的人比低学历的人强

热门文章

  1. Axure SVN共享 Commit Failed (details Follow) 问题解决
  2. 标题 日期问题java蓝桥杯,日期类的使用(java)-蓝桥杯
  3. linux下spi有哪些函数,linux下怎么快速的使用 SPI 驱动。
  4. element-ui select
  5. 20172327 2018-2019-1 《程序设计与数据结构》第八周学习总结
  6. Ubuntu 16.04 64位安装YouCompleteMe
  7. Maven(五)使用Nexus搭建Maven私服
  8. string.Format 指定字符串宽度
  9. 然爸读书笔记(2014-5)----团队正能量
  10. apache OFBiz的安装