From 0fa61f35133f825a4dbeb7dea66d4e540e93e455 Mon Sep 17 00:00:00 2001 From: liubinpeng Date: Tue, 6 Apr 2021 11:38:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Socket=E5=B1=82SIGPIPE=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7Crash?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chapter5 - Network/5.5.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Chapter5 - Network/5.5.md b/Chapter5 - Network/5.5.md index 7c415bf..ee25eaf 100644 --- a/Chapter5 - Network/5.5.md +++ b/Chapter5 - Network/5.5.md @@ -39,6 +39,15 @@ Mach 异常都在 host 层被 `ux_exception` 转换为相应的 unix 信号, int value = 1; setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value)); ``` + + +`SO_NOSIGPIPE` 是一个宏定义,跳过去看一下实现 + +```c++ +#define SO_NOSIGPIPE 0x1022 /* APPLE: No SIGPIPE on EPIPE */ +``` + +什么意思呢?没有 SIGPIPE 信号在 EPIPE。那啥是 `EPIPE`。 其中:**EPIPE** 是 socket send 函数可能返回的错误码之一。如果发送数据的话会在 Client 端触发 RST(指Client端的 FIN_WAIT_2 状态超时后连接已经销毁的情况),导致send操作返回 `EPIPE`(errno 32)错误,并触发 `SIGPIPE` 信号(默认行为是 **Terminate**)。