我使用的是 Linux/Ubuntu。我编写了一对分别实现 TCP 服务器和 TCP 客户端的类。部分代码是为了从断开连接中正常恢复。我唯一的问题是 SIGPIPE。我已经编写了代码来捕获信号,但我希望它在击中损坏管道的类实例上启动“尝试重新连接”过程。 signal( SIGPIPE, functionname ) 要求函数名称为 C 类型函数或静态类方法。
如果应用程序中有多个类实例,如何确定 SIGPIPE 发生在哪个套接字?
最佳答案
SIGPIPE
对于 TCP 来说是没有用的。该信号是为 shell 管道(例如 proc_1 | proc_2 | proc_3
)发明的,因为 SIGINT
仅传递到 shell 管道中的最后一个进程。当最后一个进程被杀死并且前一个进程尝试写入其 stdout 时,它会被 SIGPIPE 杀死,因为管道的读取器终止等等,从而有效地杀死 shell 管道中涉及的所有进程。这就是为什么信号的名称中含有单词 pipe。
通常人们在执行 TCP 时会完全忽略 SIGPIPE
:
// Early in main().
signal(SIGPIPE, SIG_IGN);
和/或:
ssize_t rc = send(..., MSG_NOSIGNAL);
if(rc == -1)
// errno can be EPIPE
这样您只需处理来自 send
的错误,并将 errno
设置为 EPIPE
。
当SIGPIPE
被忽略时,没有必要使用MSG_NOSIGNAL
,但这仍然是一个很好的做法,IMO。
关于c++ - C++ 中的 SIGPIPE 确定哪个 TCP 套接字已断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229430/