send() 系统调用第一次成功,即使远端关闭了连接。如果我再次发送,则会生成 sigpipe。我不想使用 recv 系统调用来知道远程端是否关闭了连接。
那么有人可以告诉我如何检测远程端是否仅使用发送系统调用关闭了连接?
send() 系统调用第一次成功,即使远端关闭了连接。如果我再次发送,则会生成 sigpipe。我不想使用 recv 系统调用来知道远程端是否关闭了连接。
那么有人可以告诉我如何检测远程端是否仅使用发送系统调用关闭了连接?
您应该做的第一件事是调用signal(SIGPIPE, SIG_IGN);
以避免接收SIGPIPE
,send()
或者在 Linux 上,将MSG_NOSIGNAL
标志传递给send()
. 完成此操作后,当对等方断开连接时send()
不会生成SIGPIPE
信号,而是返回 -1 和errno == EPIPE
.
发送SIGPIPE
是write()
函数的历史行为。http://pubs.opengroup.org/onlinepubs/009604599/functions/write.html
EPIPE
尝试写入管道或未FIFO
打开以供任何进程读取,或仅打开一端。SIGPIPE
还应向线程发送信号。
最初它是为壳管(如cmd | other_cmd
)创建的。在ctrl-c
shell 管道执行期间按下时,只有管道中的最后一个进程接收SIGINT
并终止。终止管道中的其他进程SIGPIPE
被发送到试图write()
进入STDOUT
其阅读器已经终止的进程。