惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
A
About on SuperTechFans
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 叶小钗
博客园 - 聂微东
博客园 - Franky
Apple Machine Learning Research
Apple Machine Learning Research
罗磊的独立博客
量子位
博客园 - 三生石上(FineUI控件)
Recent Announcements
Recent Announcements
The GitHub Blog
The GitHub Blog
B
Blog RSS Feed
T
The Blog of Author Tim Ferriss
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - 寒魔影

Linux waitpid函数分析 不同进程内相同的变量内存地址是相同的 Linux 内存虚拟地址介绍 Sword B树学习笔记二 Sword B树学习笔记一 defined but not used警告屏蔽 apisix流量高峰期服务卡住问题 服务卡死现象分析实录 服务资源加载延迟异常增加 Linux 常用命令四 TCP全连接队列 epoll_wait监听事件延迟问题记录 writev发送数据失败 C++ new关键字运算符重载 Missing separate debuginfos类型崩溃分析 宏定义导致数据异常问题 服务压测偶现卡住问题分析 C语言 数据类型 Linux 终端光标控制函数
调用writev收到信号SIGPIPE问题分析记录
寒魔影 · 2025-03-20 · via 博客园 - 寒魔影

问题描述

在调试服务程序,发现调用writev()函数之后,程序接收到SIGPIPE导致程序异常终止。

writev received signal SIGPIPE, Broken pipe.

问题分析

1.查询writev返回SIGPIPE信号的原因

通过查询资料,这种报错是主要是因为向一个已经关闭的套接字(socket)写入数据时,由此可知可能是套接字出现了问题,我的代码逻辑是connect()成功之后直接调用writev(),按道理不应该是一个关闭的套接字。

2.分析套接字是否已经关闭

我首先观察fd等数据,发现fd数值比较正常,那么我怎么才能确认自己的套接字是正常的呢?我的办法是抓包,如果这个套接字是正常的,那么肯定会存在三次握手的报文。通过抓包,发现我调用connect()函数之后并没有出现相应的报文信息。

3.确认是connect()函数出现异常

gdb调试connect的入参,没有发现任何异常,甚至于我打印 struct sockaddr对象内部也完全没有问题。

我决定采取比较法分析问题,我自己实现了一个demo程序,发现connect()是成功的。

然后我在服务内部采取注释法,刨除掉所有不相关的代码,只实现connect功能,发现网络请求是正常的。

通过不断排除法,最终发现问题出现在connect()入参struct sockaddr上。

仔细分析代码,发现struct sockaddr对象是一个无效的对象,因此这个对象是一个栈变量,并且这个栈变量已经失效了,但是我仍然使用他作为connect的参数导致了异常。

问题小结

1.connect()函数返回成功并不表示三次握手已经成功,需要通过抓包类似的手段来进行确认;

2.已经失效的变量可能内部数据还没有改变,但是这个变量已经是野指针了,编程中需要注意这一点。