程序被SIGPIPE信号终止的原因以及解决方法

本文探讨了当服务器关闭连接后客户端继续发送数据时遇到的问题。根据TCP协议规定,客户端会接收到RST响应,并由系统发出SIGPIPE信号告知连接已断开。文章详细解释了SIGPIPE信号的默认行为为终止进程,并提出了解决方案,即通过调整信号处理方式来避免进程意外退出。
/*
 * 当服务器close一个连接时,若client端接着发数据。
 * 根据TCP协议的规定,会收到一个RST响应,
 * client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,
 * 告诉进程这个连接已经断开了,不要再写了。
 * 根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),
 * 所以client会退出。
 * 因此建议应用根据需要处理SIGPIPE信号,至少不要用系统缺省的处理方式处理这个信号,
 * 系统缺省的处理方式是退出进程,这样你的应用就很难查出处理进程为什么退出了。
 *
 * 这个问题只在Linux有,在Windows下没有。
 * 若在线程中有对socket发送数据的操作,可将SIGPIPE信号放入阻塞集,即:不发送SIGPIPE信号给线程。
 * 这样应用程序就不会被莫名其妙的退出了。
 */

sigset_t signal_mask;
sigemptyset(&signal_mask);
sigaddset(&signal_mask, SIGPIPE);
if ( 0 != pthread_sigmask(SIG_BLOCK, &signal_mask, NULL) )
{
    perror("pthread_sigmask");
}


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值