簡體   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