我使用Linux / Ubuntu。我已经编写了一对分别实现TCP服务器和TCP客户端的类。部分代码是从断开连接中正常恢复。我唯一的问题是SIGPIPE。我已经编写了捕获信号的代码,但是我希望它能够启动"尝试重新连接"处理损坏管道的类实例上的进程。 signal(SIGPIPE,functionname)要求函数名称为C类函数或静态类方法。
如果我在应用程序中有多个类的实例,如何确定SIGPIPE发生了哪个套接字?
答案 0 :(得分:3)
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。