You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

忽略SIGPIPE后write()返回EPIPE,仍需关闭套接字文件描述符吗?

关于EPIPE发生后是否需要关闭套接字文件描述符的解答

首先明确给出结论:是的,你仍然需要关闭这个套接字文件描述符,核心原因如下:

  • 当write()返回EPIPE错误时,说明对应的TCP连接已经彻底失效——对端已经关闭了连接,你的进程尝试向一个没有接收方的连接写入数据,此时这个套接字再也无法进行任何有效的读写操作,留着它没有任何实际意义。
  • 文件描述符是操作系统分配的有限资源,如果不主动关闭失效的fd,会造成资源泄漏。对于长期运行的服务进程来说,积累的未关闭fd会逐渐耗尽系统允许的文件描述符上限,导致后续无法创建新套接字、打开文件等操作,直接影响进程正常运行。
  • 忽略SIGPIPE只是避免了进程被这个信号终止,但并没有修复套接字本身的错误状态。失效的套接字依然占用着系统资源,必须通过close()调用主动释放。

补充一个小细节:其实不管write()失败的原因是不是EPIPE,只要确定这个套接字不再被使用,都应该关闭它。但针对EPIPE场景,这个套接字肯定已经彻底失效,所以关闭是必须的操作。你示例里的代码逻辑是没问题的,若想更严谨,也可以考虑在其他致命错误(比如EBADF、EIO)发生时同步关闭fd,但针对你的问题场景,处理EPIPE时关闭fd完全正确且必要。

内容的提问来源于stack exchange,提问作者Killian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:08:55