在 TCP 通信双方中,为了描述方便,以下将通信双方用 A 和 B 代替。
根据TCP协议规定,如果A关闭连接后B继续发送数据,B会收到A的RST响应。若B继续发送数据,系统会发出SIGPIPE信号告知连接已断开,停止发送。
系统对 SIGPIPE 信号的默认处理行为是让 B 进程退出。
操作系统对 SIGPIPE 信号的这种默认处理行为非常不友好,让我们来分析一下。
TCP通信是全双工信道,相当于两条单工信道,连接两端各负责一条。
当对端“关闭”时, 虽然本意是关闭整个两条信道,但本端只是收到 FIN 包。
根据TCP协议的规定,当一端关闭其负责的单向通道时,仍可接收数据但不再发送数据。
也就是说,因为 TCP 协议的限制,通信一方无法获知对端的 socket 是调用了 close 还是 shutdown。
int shutdown(int socket, int how);
shutdown 函数的参数 how 可以设置为关闭 SHUT_RD、SHUT_WR 或 SHUT_RDWR 用于表示关闭收、发单个通道或者同时关闭收发通道。
对一个已经收到 FIN 包的 socket 调用 read/recv 方法, 如果接收缓冲已空,则返回 0,这就是常说的表示连接关闭。但第一次对其调用 write/send 方法时,如果发送缓冲没问题,会返回正确写入(即 write/send 函数返回值大于 0),但发送的报文会导致对端回应 RST 报文。因为上一次程序调用 write/send 是正常的,再次尝试调用 write/send 函数时因产生 SIGPIPE 信号导致进程退出。
这种默认行为对于我们开发程序,尤其是对于后端服务,需要同时对许多客户端服务,不能因为与某一个客户端的连接出问题了而导致整个进程退出不能继续为其他客户端服务。
为了避免这种现象出现, 可以捕获 SIGPIPE 信号并对其进行处理或者忽略该信号, 忽略该信号代码如下:
signal(SIGPIPE, SIG_IGN);
这样设置后,第二次调用 write/send 方法时,会返回 -1,同时 errno 错误码被置为 SIGPIPE,程序便能知道对端已经关闭。
以上是Linux SIGPIPE信号的详细内容。更多信息请关注PHP中文网其他相关文章!

您是否曾经遇到过“任务栏颜色不变”的问题?您对这个问题感到困惑吗? PHP.CN的这篇文章重点介绍此问题,并为您提供了几种可帮助您修复的方法。

尝试连接到Windows Server时,您可能会遇到远程桌面服务当前忙的错误。 Windows Server设置和用户设备都可能是此错误的原因。无论原因是什么,php.cn都可以帮助您

Windows在扫描病毒时会关闭? Windows Defender的完整扫描会使PC关闭?当这个问题发生时该怎么办?在PHP.CN的这篇文章中,您将学习一些可行的解决方案。

CHATGPT网络错误是编写代码或AI编写长答案时可能发生的常见问题。如果您遇到此问题,该怎么办?不用担心,尝试在这篇文章中使用PHP.CN收集的几种方式来轻松获取

获取Windows更新的一种方法是单击Windows Update中的“检查更新”按钮。但是,如果检查更新按钮的检查是灰色的,您知道要解决问题吗?在这篇文章中,PHP.CN软件将引入一些甲基苯丙胺

Outlook草稿电子邮件通常存储在草稿文件夹中。但是,有时您可能会遇到“ Outlook不保存草稿”的问题。在这种情况下,您应该如何找到电子邮件草案并处理此问题?在这篇文章中

这篇文章提供了iCloud邮件登录和注册指南。您可以创建一个免费的iCloud邮件帐户来使用它来在网络或任何设备上发送或接收电子邮件。还包括有关如何在Windows 10/11或Android上访问iCloud邮件的说明。
![下载并安装Windows ADK用于Windows [完整版本] -Minitool](https://img.php.cn/upload/article/001/242/473/174611767195293.png?x-oss-process=image/resize,p_40)
当您尝试提供Windows 11/10时,您需要Windows ADK(Windows评估和部署套件)的相应版本来帮助您完成任务。这篇来自PHP.CN的帖子会教您如何下载和安装Windows ADK。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版
中文版,非常好用

Dreamweaver Mac版
视觉化网页开发工具