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

Linux SIGPIPE信号产生原因与解决方法TCP四次握手产生SIGPIPE的原因SIGPIPE信号产生的原因:简单来说,就是客户端程序向服务器端程序发送了消息,然后关闭客户端,服务器端返回消息的时候就会收到内核给的SIGPIPE信号。TCP的全双工信道其实是两条单工信道,client端调用close的时候,虽然本意是关闭两条信道,但是其实只能关闭它发送的那一条单工信道,还是可以接受数据,server端还是可以发送…

大家好,又见面了,我是你们的朋友全栈君。

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.net/139110.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月30日 下午12:36
下一篇 2022年5月30日 下午12:36


相关推荐

  • 大数据,云计算,物联网三者的区别和关联方法_云计算和物联网的应用

    大数据,云计算,物联网三者的区别和关联方法_云计算和物联网的应用大数据时代的到来,是全球知名咨询公司麦肯锡最早提出的,麦肯锡称:“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。人们对于海量数据的挖掘和运用,预示着新一波生产率增长和消费者盈余浪潮的到来。”《互联网进化论》一书中提出“互联网的未来功能和结构将于人类大脑高度相似,也将具备互联网虚拟感觉,虚拟运动,虚拟中枢,虚拟记忆神经系统”,并绘制了一幅互联网虚拟大脑结构图。…

    2026年4月17日
    3
  • 月之暗面发布 Kimi K2.5,打造全球最强开源模型,新增视觉能力

    月之暗面发布 Kimi K2.5,打造全球最强开源模型,新增视觉能力

    2026年3月12日
    3
  • utc时间戳转换器_java时间转字符串

    utc时间戳转换器_java时间转字符串StringutcStr=”ThuAug1416:45:37UTC2011″;Datedate=newDate(utcStr);SimpleDateFormatsf=newSimpleDateFormat(“yyyy-MM-dd”);sf.format(date);

    2022年10月3日
    5
  • turtlebot+lms111+gmapping实践

    turtlebot+lms111+gmapping实践1.配置激光按照cartographer的配置来如果已经跑过cartographer无需配置2.计算机文件夹下需修改的地方在桌面上新建文档gmapping.launch.xml文件内容如下…

    2022年6月21日
    22
  • FCOS理解

    FCOS理解原文链接 https blog csdn net hjxu2016 article details 论文链接 FCOS FullyConvolu StageObjectD 代码链接 https github com tianzhi0549 FCOS 一 Anchor based 的缺点 Anchor 的设计非常重要 需要小心的调整超参数 以 SSD YOLOV2 V3 等为例 超参数的选择对最终结果影响盛大即使仔细的设计了超参数 也难以所有

    2026年3月16日
    3
  • 服务熔断的实现

    服务熔断的实现0 服务熔断的实现思路 引入 hystrix 依赖 并开启熔断器 断路器 模拟降级方法 进行调用测试 1 项目中引入 hystrix 依赖 引入 hystrix dependency groupId org springframew cloud groupId artifactId spring cloud starter netflix hystrix artifactId dependency

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号