我在套接字上使用accept调用,该套接字只接受与客户端进程的连接。但是,使用信号SIGALRM的sigaction实现的信号处理程序被注册为可行连接。我想我应该用select或poll来检查连接,但我不确定这是否只会使它变得复杂。任何帮助将不胜感激。
编辑:抱歉说这是一个连接。它似乎只是一种联系。我的代码有一个while循环,只要accept没有计算为0就会运行。
更新:所以我发现了我的问题。 sigaction标志是默认值。我把它更改为SA_RESTART并接受现在工作正常。我认为这与忽略原始I / O和返回EINTR有关,但我并不完全确定。谁知道?
答案 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个月后写的你的代码)