SIGPIPE 原因和解决办法和信号处理

SIGPIPE信号通常在进程尝试向已关闭的socket写入时产生,导致程序终止。解决方法包括忽略SIGPIPE信号或在发送前检查连接状态。设置socket选项MSG_NOSIGNAL或使用sigaction忽略信号是常见做法。此外,当recv()返回0时,表示服务端已关闭连接,客户端应重新建立连接。
摘要由CSDN通过智能技术生成

sdf水电费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));

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值