接受被信号处理程序干扰的呼叫

时间:2015-12-09 07:58:29

标签: c sockets signals

我在套接字上使用accept调用,该套接字只接受与客户端进程的连接。但是,使用信号SIGALRM的sigaction实现的信号处理程序被注册为可行连接。我想我应该用select或poll来检查连接,但我不确定这是否只会使它变得复杂。任何帮助将不胜感激。

编辑:抱歉说这是一个连接。它似乎只是一种联系。我的代码有一个while循环,只要accept没有计算为0就会运行。

更新:所以我发现了我的问题。 sigaction标志是默认值。我把它更改为SA_RESTART并接受现在工作正常。我认为这与忽略原始I / O和返回EINTR有关,但我并不完全确定。谁知道?

1 个答案:

答案 0 :(得分: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个月后写的你的代码)