2015-12-09 29 views
0

我在一个只能接受客户端进程连接的套接字上使用accept调用。然而,用信号SIGALRM的sigaction实现的信号处理程序被注册为可行的连接。我想我应该检查与选择或民意调查的连接,但我不知道如果这只是复杂。任何帮助,将不胜感激。接受受信号处理器干扰的呼叫

编辑:对不起,说这是一个连接。它似乎只是一个连接。我的代码有一个while循环,条件只要接受未评估为0即可运行。

更新:所以我刚发现我的问题。 sigaction标志是默认值。我将其更改为SA_RESTART并立即接受正常工作。我认为这与忽略原始I/O和返回EINTR有关,但我不完全确定这一点。有人知道吗?

+0

信号处理程序如何成为一个“可行的连接”?这没有任何意义......连接由文件描述符表示,“accept”返回文件描述符,而信号处理程序不是文件描述符。 – immibis

+0

这就是为什么我很困惑。出于某种原因,信号处理程序捕获信号时会进行连接。 –

+0

您如何知道连接已建立? – immibis

回答

1

在Linux上,系统调用(包括accept)可能被信号中断。

如果系统调用正在进行时收到信号,系统调用将中止并返回错误EINTR。尽管这是一个“错误”,但并不意味着出现了问题,只是意味着您必须再次尝试呼叫。这个设计背后的理由相当复杂,并且超出了这个问题的范围。

正如您发现的那样,您可以设置sigaction标志SA_RESTART,使其不会发生特定信号。 accept返回-1,如果遇到错误,所以这看起来是这样的:

while(1) 
{ 
    int client_sock = accept(...); 
    if(client_sock == -1) 
    { 
     if(errno == EINTR) 
      continue; // try again 
     ... normal error handling here ... 
    } 
    else 
    { 
     ... normal connection handling here ... 
    } 
} 

更健壮的解决办法是检查EINTR明确 - 如果你的程序得到它毫无准备的信号,或者其他代码使用信号并且不设置SA_RESTART。 (这可能是你的代码,你写3个月后)

+0

不能在<15代表投票,但感谢提供丰富的答案。 –