必威体育Betway必威体育官网
当前位置:首页 > IT技术

Linux SIGPIPE信号产生原因与解决方法

时间:2019-08-16 09:14:26来源:IT技术作者:seo实验室小编阅读:60次「手机版」
 

sigpipe

TCP 四次握手

这里写图片描述

产生SIGPIPE的原因

SIGPIPE信号产生的原因:

简单来说,就是客户端程序服务器端程序发送了消息,然后关闭客户端,服务器端返回消息的时候就会收到内核给的SIGPIPE信号。

TCP的全双工信道其实是两条单工信道,client端调用close的时候,虽然本意是关闭两条信道,但是其实只能关闭它发送的那一条单工信道,还是可以接受数据,server端还是可以发送数据,并不知道client端已经完全关闭了。

以下为引用:

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

这里写图片描述

RST报文:

以下几种情况会产生RST

1)CLOSE状态的socket收到任何数据都会返回RST,即为我遇到的情况

其他参见RFC793 tcp协议

这里写图片描述

解决方法

#include <signal.h>
void handle_pipe(int sig)
{
//do nothing
}
int main()
{
    struct sigaction sa;
    sa.sa_handler = handle_pipe;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sigaction(SIGPIPE,&sa,NULL);
//do something
}

相关阅读

改造Android手机为,便携式linux服务器,跑tomcat

环境设备1) 闲置安卓手机一部,我的是 oppoR7. 要获取root权限。如果总root失败可以刷下机。2) 可以开热点的 windows电脑一部,我的

Linux修改文件名

linux 高并发事件触发处理 — epoll

一. 概述 epoll 是 Linux 内核为处理大批量文件描述符而作了改进的 poll,是 Linux 下多路复用 IO接口 select/poll 的增强版本

error: stray ‘\×××’ in program错误原因及解决

网上down了一个C++的程序,内容很简单,但g++编译时报错,报错内容如下 error: stray ‘\342’ in program VideoCapture cap(”nvc

Linux配置VMware三种网络模式

桥接模式(Bridged) 桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下,类似于把物理主机虚拟为一个

分享到:

栏目导航

推荐阅读

热门阅读