即使远程端关闭了连接,send()系统调用还是第一次成功。
如果我再次发送,那么将生成sigpipe。
我不想使用recv系统调用来知道远程端是否关闭了连接。
那么,有人能告诉我,我如何才能检测远程端是否只使用发送系统调用就关闭了连接?

最佳答案

您应该做的第一件事是调用signal(SIGPIPE, SIG_IGN);以避免在SIGPIPE上接收send(),或者在linux上,将MSG_NOSIGNAL标志传递给send()。这样做之后,send()不会在对等端断开连接时生成SIGPIPE信号,而是返回-1和errno == EPIPE
发送SIGPIPEwrite()函数的历史行为。http://pubs.opengroup.org/onlinepubs/009604599/functions/write.html
EPIPE试图写入未打开供任何进程读取或只有一端打开的管道或FIFO。aSIGPIPE信号也应发送到线程。
最初它是为shell管道创建的(比如cmd | other_cmd)。当在shell管道执行期间按下ctrl-c时,只有管道中的最后一个进程接收到SIGINT并终止。若要终止管道中的其他进程,则会将SIGPIPE发送到试图将write()插入其读取器已终止的STDOUT的进程。

关于linux - 如何知道远端是否使用发送系统调用关闭了套接字?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7466926/

10-13 07:11