即使远程端关闭了连接,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.htmlEPIPE
试图写入未打开供任何进程读取或只有一端打开的管道或FIFO
。aSIGPIPE
信号也应发送到线程。
最初它是为shell管道创建的(比如cmd | other_cmd
)。当在shell管道执行期间按下ctrl-c
时,只有管道中的最后一个进程接收到SIGINT
并终止。若要终止管道中的其他进程,则会将SIGPIPE
发送到试图将write()
插入其读取器已终止的STDOUT
的进程。
关于linux - 如何知道远端是否使用发送系统调用关闭了套接字?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7466926/