[英]SIGPIPE (OSX) and disconnected sockets?
我正在开发一个通过TCP连接到服务器的应用程序。
如果套接字出于某种原因被关闭,我最终会进入SIGPIPE处理程序。
我怎么做才能使recv和send只在断开/关闭的套接字上返回错误?
谢谢
我发现忽略了在OS X上无效的SIGPIPE。请改用SO_NOSIGPIPE。 注意这是在套接字上设置一次,而不是每次调用send()时请求的MSG_NOSIGNAL。
int socket = accept (...); /* (or however you're getting the socket) */
int option_value = 1; /* Set NOSIGPIPE to ON */
if (setsockopt (socket, SOL_SOCKET, SO_NOSIGPIPE, &option_value, sizeof (option_value)) < 0) {
perror ("setsockopt(,,SO_NOSIGPIPE)");
}
SIG_IGN
信号而不是处理它。 send
将返回-1并且errno将设置为EPIPE。
要忽略信号,请将SIG_IGN
的信号处理程序设置为:
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_IGN;
if (-1 == sigaction(SIGPIPE, &sa, NULL))
{
perror("sigaction() failed");
}
忽略其他答案中描述的SIGPIPE(即signal(SIGPIPE, SIG_IGN);
)在OS X上为我工作。另外一定要在调试器外测试,如本评论中所述 。 我正在使用lldb
进行调试,它的信号处理正在用SIGPIPE终止我的程序,即使我忽略了那个信号。 在lldb
之外的lldb
工作正常。
使用信号处理程序或忽略它
#include <signal.h>
signal(SIGPIPE, SIG_IGN);
在写入套接字时,首先检查套接字fd在程序中是否为正。 在外部,您应该检查是否正在发送有效套接字的指针
你可以忽略SIGPIPE
#include <signal.h>
signal(SIGPIPE, SIG_IGN);
或者您可以使用信号处理程序。
signal(SIGPIPE, handler);
void handler(int signal)
{
//("Signal caught");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.