Linux recvfrom()带报警的超时()

Linux recvfrom()带报警的超时(),linux,posix,signals,alarm,Linux,Posix,Signals,Alarm,我正在调试以下代码: signal(SIGALRM, testt); alarm(1); result = recvfrom( listening_socket, buf, maxlen, 0, &from, &fromlen ); printf("s

我正在调试以下代码:

signal(SIGALRM, testt);                                                  
alarm(1);                                                                
result = recvfrom( listening_socket, buf, maxlen, 0, &from, &fromlen );  
printf("stoped\n");          
man 3 SIGTRUPTION
所述,警报应该会中断系统调用,但在我的情况下不会。调用报警处理程序,但不会中断
recvfrom

但是,当使用signal(2)函数指定新的信号处理程序时,默认情况下系统调用会中断

如果我添加
sigcrupt(SIGALRM,1)设置报警处理程序后,按预期中断
recvfrom

我错过了什么?我的代码怎么了

注意:用
sigaction
替换
signal
不是我要找的。

siginterrupt(3)
手册页不正确(Linux手册页集的设置更正了错误)。glibc的
信号的默认行为是建立一个不中断系统调用的信号。您可以通过
strace
亲自看到这一点:

void handler(int unused) {}
int main(void)
{
  signal(SIGALRM, handler);
}
&longrightarrow

$ strace -e trace=rt_sigaction ./a.out
rt_sigaction(SIGALRM, 
             {0x4005b4, [ALRM], SA_RESTORER|SA_RESTART, 0x7fe732d3d490}, 
             {SIG_DFL, [], 0}, 8) = 0

注意这里的sau重启。您可以继续执行您正在执行的操作—在建立处理程序后调用
sigiinterrupt(SIGALRM,1)
,也可以切换到使用
sigaction
,这将允许您首先以您想要的方式设置标志。你说你不想这么做(为什么?),但我还是建议你这么做。

TIL strace-e trace=rt_sigaction。建立处理程序的不是我的代码。@扎克:手册页没有错,只是引用错误。完整的引号是:
如果标志参数为false(0),那么如果被指定的信号sig中断,系统调用将重新启动。这是Linux中的默认行为。但是,当使用信号(2)函数指定新的信号处理程序时,系统调用默认会中断。
@ninjalj:我觉得我太累了,为什么第一句话与
signal()
相关?@Alexandru:这是第二句:
这是Linux中的默认行为。
即glibc的
signal()
默认情况下设置SA_重新启动。哼,既然你这么说了,第三句就错了。@ninjalj那句话的最后一句就错了。
signal(2)
手册页有几个段落解释系统调用没有中断(默认情况下,在glibc 2中,等等)。请注意,
signinterrupt(3)
在POSIX.1-2008中被标记为过时。