Linux SIGPIPE信号产生原因与解决方法
2023-06-13 09:11:52 时间
大家好,又见面了,我是你们的朋友全栈君。
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
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139110.html原文链接:https://javaforall.cn
相关文章
- 精简系统:如何删除多余的Linux内核(删除多余的linux内核)
- Linux登录进入新世界的神奇工具(linux登陆工具)
- 管理Linux设备权限管理:维护系统安全(linux设备权限)
- Linux下U盘快速格式化方法(u盘linux格式化)
- Linux下查看磁盘空间的方法(查看磁盘空间linux)
- 解决Linux远程连接无效问题(linux无法远程连接)
- 查询Linux VG信息查询:一种新方法(linuxvg信息)
- Linux 安装 QQ:一步一步搞定(linux安装qq)
- 安装成程序Linux下安装二进制文件的简单方法(linux下把二进制文件)
- 映射Linux下实现端口映射的方法(linux创建端口)
- Linux: 开放创新的操作系统(linux的分支)
- Linux系统的防火墙关闭方法(关闭linux的防火墙)
- Linux系统下实现防火墙保护(linux中防火墙)
- Linux系统快速进入E盘的方法(linux进入e盘)
- 快速上手:Linux创建文件的简单方法(linux创建文件的方法)
- Linux系统重置方法大揭秘(linux的系统怎么重置)
- Linux保留空间:提升性能(linux预留空间)
- 如何在Linux中自动加载ko内核模块(linux自动加载ko)
- 解决Linux命令行乱码问题的实用技巧(linux命令行乱码)
- Linux网络设置:修改网关(修改linux网关)
- 快速掌握Linux主机名称的查看方法(如何查看linux主机名)
- Linux睡眠一个命令搞定(linux睡眠命令)
- 模型解析Linux I/O 模型及其实现(linux i o)
- 收集Linux系统下采集CPU信息的方法(linux cpu 信息)