SIGPIPE信号产生的规则:当一个进程向某个已收到RST的套接字执行写操作时,内核向该进程发送SIGPIPE信号。

<1>如果客户端关闭了socket(close),而服务端调用了一次write,服务端就会接收到一个RST Segment,如果服务端再次调用write,这个时候就会产生SIGPIPE信号,默认终止进程

直接忽略SIGPIPE信号:signal(SIGPIPE, SIG_IGN)

SIG_IGN忽略信号

<2>SIGPIPE产生的原因是这样的:如果一个 socket 在接收到了 RST packet 之后,程序仍然向这个 socket 写入数据,那么就会产生SIGPIPE信号。
  这种现象是很常见的,譬如说,当 client 连接到 server 之后,这时候 server 准备向 client 发送多条消息,但在发送消息之前,client 进程意外奔溃了,那么接下来 server 在发送多条消息的过程中,就会出现SIGPIPE信号

例子代码:

网络编程中的 SIGPIPE 信号 - tycoon3 - 博客园

<3>

另外,我再做一些补充,产生RST响应以至于系统发出SIGPIPE信号,应该分为两种情况:

1. 客户端到服务端之间网络断掉,或者服务端断电等,物理连接断掉了,这种情况下客户端不会退出,send函数正常执行,不会感觉到自己出错。因为由于物理网络断开,服务端不会给客户端回应错误消息,没有RST响应,自然也不会产生SIGPIPE信号。但是当服务端再恢复正常的时候,对客户端send来的消息会产生RST响应,客户端就收到SIGPIPE信号了,程序退出,但是这时send函数是能够返回 -1的。可以进行异常处理。

2.客户端到服务端的网络能通,服务程序挂掉,客户端程序会马上退出,因为服务端能正常返回错误消息,客户端收到,SIGPIPE信号就产生了。不过我不确定此时服务端返回是的RST响应,抓包来看没有RST标志。水平有限,只写到这了。

问题解决:

由上面原因总结出两种方法:

1、设置系统忽略SIGPIPIE消息,从结果解决SIGPIPE错误导致程序崩溃问题;

在socket建立时设置下列属性,socket将不会产生SIGPIPE信号。

int optval=1;

#ifdef __linux__

setsockopt(m_Sockfd, SOL_SOCKET, MSG_NOSIGNAL, &optval, sizeof(optval));

#else

setsockopt(m_Sockfd, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval));

#endif

在main函数设置如下属性,SIGPIPE信号还是会产生,只是应用程序不将处理这个信号,也就不会闪退。

#ifdef UNIX_ENV

struct sigaction sa;

sa.sa_handler = SIG_IGN;

sigaction(SIGALRM, &sa, 0);

sigaction(SIGPIPE, &sa, 0);

#endif

2、客户端在发送报文前判断连接状态,并决定是否重新建立连接,这样从根源解决这个问题。

客户端在发送前非阻塞读取数据,如果发现recv()返回0时,代表服务端已经关闭socket,此时需要重新建立连接。为了方便调试,linux下返回错误提示的变量errno可以输出出来查看,此变量在socket建立时初始值为0,非组态connect连上后值为errno值发生变化一般为EINPROGRESS。

当调用connect、listen、accept、recv、write等socket接口时,返回小于0的值时表示出现错误,可以通过查看errno值定位问题。目前看来其他返回值不会修改errno的值。

符号名  信号值 描述                是否符合POSIX
SIGHUP  1   在控制终端上检测到挂断或控制线程死亡  是
SIGINT  2   交互注意信号              是
SIGQUIT  3   交互中止信号              是
SIGILL  4   检测到非法硬件的指令          是
SIGTRAP  5   从陷阱中回朔              否
SIGABRT  6   异常终止信号              是
SIGEMT  7   EMT 指令                否
SIGFPE  8   不正确的算术操作信号          是
SIGKILL  9   终止信号                是
SIGBUS  10   总线错误                否
SIGSEGV  11   检测到非法的内存调用          是
SIGSYS  12   系统call的错误参数           否
SIGPIPE  13   在无读者的管道上写           是
SIGALRM  14   报时信号                是
SIGTERM  15   终止信号                是
SIGURG  16   IO信道紧急信号             否
SIGSTOP  17   暂停信号                是
SIGTSTP  18   交互暂停信号              是
SIGCONT  19   如果暂停则继续             是
SIGCHLD  20   子线程终止或暂停            是
SIGTTIN  21   后台线程组一成员试图从控制终端上读出  是
SIGTTOU  22   后台线程组的成员试图写到控制终端上   是
SIGIO   23   允许I/O信号               否
SIGXCPU  24   超出CPU时限               否
SIGXFSZ  25   超出文件大小限制            否
SIGVTALRM 26   虚时间警报器              否
SIGPROF  27   侧面时间警报器             否
SIGWINCH 28   窗口大小的更改             否
SIGINFO  29   消息请求                否
SIGUSR1  30   保留作为用户自定义的信号1        是
SIGUSR2  31   保留作为用户自定义的信号        是

Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做”不可靠信号”,信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是”不可靠信号”的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。

SIGPIPE 原因和解决办法相关推荐

  1. oracle library cache lock,【案例】Oracle等待事件library cache lock产生原因和解决办法...

    [案例]Oracle等待事件library cache lock产生原因和解决办法 时间:2016-12-07 18:56   来源:Oracle研究中心   作者:网络   点击: 次 天萃荷净 O ...

  2. 服务器越来越慢的原因及解决办法

    随着各种主机产品的推出,服务器出现的问题各式各样,由于虚拟主机都是同时运行,便会对服务器产生过大的压力,从而导致服务器的速度越来越缓慢,下面和大家分享一下服务器越来越慢的原因及解决办法. 1.虚拟主机 ...

  3. iis 无法连接mysql_远程无法连接SQL2000及MySQL的原因和解决办法

    远程无法连接SQL2000及MySQL的原因和解决办法 时间:2019-11-10 11:06 1. 没有在数据库管理面板中设置远程连接IP造成的. 说明:为了提高操作系统的安全性,所有使用了星外安全 ...

  4. com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1问题出现的原因及解决办法

    转自:https://blog.csdn.net/shinchan_/article/details/37818927 com/opensymphony/xwork2/spring/SpringObj ...

  5. 欠拟合的原因以及解决办法(深度学习)

    之前这篇文章,我分析了一下深度学习中,模型过拟合的主要原因以及解决办法: 过拟合的原因以及解决办法(深度学习)_大黄的博客-CSDN博客 这篇文章中写一下深度学习中,模型欠拟合的原因以及一些常见的解决 ...

  6. android qq三方登录授权失败,QQ第三方登陆授权失败110401原因及解决办法分享

    qq第三方登陆授权失败出现代码110401是什么情况?遇到这种情况该如何解决?相信很多用户们在操作的时候都出现过类似的情况吧?下面是小编带来的攻略解析,一起来关注下! qq第三方登陆授权失败11040 ...

  7. SyntaxError: invalid syntax的问题原因和解决办法

    写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 目录 一.问题 二.原因及解决办法 一.问题 // An highlighted block SyntaxError: ...

  8. mysql sleep详解_mysql sleep链接过多的原因及解决办法

    今天收到运维同事短信,说有个线上业务"可能是数据库DB堵塞了,导致mysql链接过多,让我看一下". 回家后赶紧用家里vpn登录数据库服务器,show processlist 看了 ...

  9. 富士通打印机调整位置_打印机为什么卡纸 打印机四种卡纸原因及解决办法【介绍】...

    我们在使用打印机的过程中,由于频繁使用打印机,常常会出现打印机无法处理纸张的故障.大多数常见的故障就是夹纸.不进纸.一次进多页纸以及乱走纸等.我们在打印机出现这些现象的时候,该怎样去应对呢?下面为大家 ...

最新文章

  1. Hive On Tez,Tez 和 MapReduce engine 性能对比
  2. 为什么白帽SEO更好?
  3. 日常生活中的法语积累2
  4. android 显示单位 像素
  5. 如何异步的处理restful服务(基础)
  6. 【转】POP3、SMTP和IMAP之间的区别和联系
  7. 共享单车需求预测问题:建模篇
  8. Python的单元测试工具——doctest
  9. 关于"舆情监测"关键词在百度搜索中的相关数分析
  10. 解决win10系统下字体模糊问题
  11. java wifi 对讲机_freevoice(局域网对讲机)——Android4项目实战视频教程 - 移动编程 - 私塾在线 - 只做精品视频课程服务...
  12. Gephi 入门使用
  13. PID参数整定——Z-N方法
  14. java8中Lambda表达式写法详解
  15. 利用WebSphere Edge Server构建冷轧系统负载均衡
  16. 怎么去除脸上的黄褐斑
  17. 1357:车厢调度(train)
  18. 【BZOJ4399】—膜法少女LJJ(线段树合并)
  19. 时创能源将于12月7日上会:拟募资11亿元,业绩增长迅猛
  20. 云计算企业级小架构部署应用综合练习-docker变种(一)

热门文章

  1. 为何总给外卖打差评?我们来数据分析一下!
  2. 经典SQL题 1/25/50/100美分,多少种可能拼凑成2美元
  3. 2017第111届中国文化用品商品交易会(2017上海文化展)会刊(参展商名录)
  4. 十大游戏低延迟高续航蓝牙耳机,商城爆款高性价比蓝牙耳机推荐
  5. 剑指offer-8 跳台阶
  6. 浏览器与服务器的连接
  7. php时分秒加随机数,PHP生成随机数和随机日期时间的函数介绍
  8. Python爬虫基础(三) —— 爬取动态渲染页面
  9. webservice和ajax区别,WebService简单介绍
  10. 关闭Anti Aliasing 的情况下单独对3D模型抗锯齿