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中被标记为过时。