C语言 SIGPIPE (OSX) 和断开连接的套接字



我正在开发一个通过TCP连接到服务器的应用程序。

如果套接字因某种原因关闭,我最终会进入 SIGPIPE 处理程序。

我该怎么做才能让 recv 和发送只在断开连接/关闭的套接字上返回错误?

谢谢

我发现忽略SIGPIPE在OS X上无效。 请改用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之外的测试工作正常。

你可以忽略SIGPIPE

 #include <signal.h>
signal(SIGPIPE, SIG_IGN);

或者您可以使用信号处理程序。

signal(SIGPIPE, handler);
void handler(int signal)
{   
    //("Signal caught");
}

使用信号处理程序或忽略它

#include <signal.h>
signal(SIGPIPE, SIG_IGN);
写入套接字

时,首先检查套接字 FD 是否在程序中为正。在外部,您应该检查是否正在发送有效套接字的指针

最新更新