SIGPIPE 原因和解决办法
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 原因和解决办法相关推荐
- oracle library cache lock,【案例】Oracle等待事件library cache lock产生原因和解决办法...
[案例]Oracle等待事件library cache lock产生原因和解决办法 时间:2016-12-07 18:56 来源:Oracle研究中心 作者:网络 点击: 次 天萃荷净 O ...
- 服务器越来越慢的原因及解决办法
随着各种主机产品的推出,服务器出现的问题各式各样,由于虚拟主机都是同时运行,便会对服务器产生过大的压力,从而导致服务器的速度越来越缓慢,下面和大家分享一下服务器越来越慢的原因及解决办法. 1.虚拟主机 ...
- iis 无法连接mysql_远程无法连接SQL2000及MySQL的原因和解决办法
远程无法连接SQL2000及MySQL的原因和解决办法 时间:2019-11-10 11:06 1. 没有在数据库管理面板中设置远程连接IP造成的. 说明:为了提高操作系统的安全性,所有使用了星外安全 ...
- com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1问题出现的原因及解决办法
转自:https://blog.csdn.net/shinchan_/article/details/37818927 com/opensymphony/xwork2/spring/SpringObj ...
- 欠拟合的原因以及解决办法(深度学习)
之前这篇文章,我分析了一下深度学习中,模型过拟合的主要原因以及解决办法: 过拟合的原因以及解决办法(深度学习)_大黄的博客-CSDN博客 这篇文章中写一下深度学习中,模型欠拟合的原因以及一些常见的解决 ...
- android qq三方登录授权失败,QQ第三方登陆授权失败110401原因及解决办法分享
qq第三方登陆授权失败出现代码110401是什么情况?遇到这种情况该如何解决?相信很多用户们在操作的时候都出现过类似的情况吧?下面是小编带来的攻略解析,一起来关注下! qq第三方登陆授权失败11040 ...
- SyntaxError: invalid syntax的问题原因和解决办法
写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 目录 一.问题 二.原因及解决办法 一.问题 // An highlighted block SyntaxError: ...
- mysql sleep详解_mysql sleep链接过多的原因及解决办法
今天收到运维同事短信,说有个线上业务"可能是数据库DB堵塞了,导致mysql链接过多,让我看一下". 回家后赶紧用家里vpn登录数据库服务器,show processlist 看了 ...
- 富士通打印机调整位置_打印机为什么卡纸 打印机四种卡纸原因及解决办法【介绍】...
我们在使用打印机的过程中,由于频繁使用打印机,常常会出现打印机无法处理纸张的故障.大多数常见的故障就是夹纸.不进纸.一次进多页纸以及乱走纸等.我们在打印机出现这些现象的时候,该怎样去应对呢?下面为大家 ...
最新文章
- Hive On Tez,Tez 和 MapReduce engine 性能对比
- 为什么白帽SEO更好?
- 日常生活中的法语积累2
- android 显示单位 像素
- 如何异步的处理restful服务(基础)
- 【转】POP3、SMTP和IMAP之间的区别和联系
- 共享单车需求预测问题:建模篇
- Python的单元测试工具——doctest
- 关于"舆情监测"关键词在百度搜索中的相关数分析
- 解决win10系统下字体模糊问题
- java wifi 对讲机_freevoice(局域网对讲机)——Android4项目实战视频教程 - 移动编程 - 私塾在线 - 只做精品视频课程服务...
- Gephi 入门使用
- PID参数整定——Z-N方法
- java8中Lambda表达式写法详解
- 利用WebSphere Edge Server构建冷轧系统负载均衡
- 怎么去除脸上的黄褐斑
- 1357:车厢调度(train)
- 【BZOJ4399】—膜法少女LJJ(线段树合并)
- 时创能源将于12月7日上会:拟募资11亿元,业绩增长迅猛
- 云计算企业级小架构部署应用综合练习-docker变种(一)
热门文章
- 为何总给外卖打差评?我们来数据分析一下!
- 经典SQL题 1/25/50/100美分,多少种可能拼凑成2美元
- 2017第111届中国文化用品商品交易会(2017上海文化展)会刊(参展商名录)
- 十大游戏低延迟高续航蓝牙耳机,商城爆款高性价比蓝牙耳机推荐
- 剑指offer-8 跳台阶
- 浏览器与服务器的连接
- php时分秒加随机数,PHP生成随机数和随机日期时间的函数介绍
- Python爬虫基础(三) —— 爬取动态渲染页面
- webservice和ajax区别,WebService简单介绍
- 关闭Anti Aliasing 的情况下单独对3D模型抗锯齿