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