繁体   English   中英

SIGPIPE(OSX)和断开连接的套接字?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM