1

send() 系统调用第一次成功,即使远端关闭了连接。如果我再次发送,则会生成 sigpipe。我不想使用 recv 系统调用来知道远程端是否关闭了连接。

那么有人可以告诉我如何检测远程端是否仅使用发送系统调用关闭了连接?

4

1 回答 1

1

您应该做的第一件事是调用signal(SIGPIPE, SIG_IGN);以避免接收SIGPIPEsend()或者在 Linux 上,将MSG_NOSIGNAL标志传递给send(). 完成此操作后,当对等方断开连接时send()不会生成SIGPIPE信号,而是返回 -1 和errno == EPIPE.

发送SIGPIPEwrite()函数的历史行为。http://pubs.opengroup.org/onlinepubs/009604599/functions/write.html

EPIPE尝试写入管道或未FIFO打开以供任何进程读取,或仅打开一端。SIGPIPE还应向线程发送信号。

最初它是为壳管(如cmd | other_cmd)创建的。在ctrl-cshell 管道执行期间按下时,只有管道中的最后一个进程接收SIGINT并终止。终止管道中的其他进程SIGPIPE被发送到试图write()进入STDOUT其阅读器已经终止的进程。

于 2011-09-19T08:37:39.967 回答