- A端关闭socket,B端连续send
第一次send成功返回,errno = 0。第二次直接触发SIGPIPE,进程退出,不会有send退出的流程 - B端先send一次,A端关闭socket,B端再连续send
连续send的第一次send返回-1,errno = 104,代表ECONNRESET。第二次触发SIGPIPE,进程退出,不会有send退出的流程 - B端连续send,A端待B端阻塞后关闭socket
首先send从阻塞中返回,errno = 0,但返回值应该小于要写入的长度。比如要写1024个字节,但只返回960个字节(个人理解:缓冲区剩下多少可写就返回多少)。下一次send返回-1,errno = 104,代表ECONNRESET。再下一次触发SIGPIPE,进程退出。
综上:在不忽略SIGPIPE的情况下,靠判断send的返回值来判断是否出错是不可行的。原因就是如果A端先关闭socket,B端send第一次成功返回,第二次就会直接退出。