recvfrom()超时与警报()

我正在debugging下面的代码:

signal(SIGALRM, testt); alarm(1); result = recvfrom( listening_socket, buf, maxlen, 0, &from, &fromlen ); printf("stoped\n"); 

正如man 3 siginterrupt所描述的man 3 siginterrupt ,警报应该中断系统调用,但在我的情况下却不会。 报警处理程序被调用,但recvfrom不会中断。

但是,如果使用信号(2)function指定了新的信号处理程序,系统调用将被默认中断。

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

我错过了什么? 我的代码有什么问题?

注意:用sigactionreplacesignal不是我正在寻找的。

siginterrupt(3)联机帮助页不正确(Linux联机帮助页的3.33版纠正错误)。 glibc signal的默认行为是建立一个中断系统调用的信号。 你可以用strace自己看:

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

⟶

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

注意那里的SA_RESTART。 你可以继续做你正在做的事 – 在建立处理程序之后调用siginterrupt(SIGALRM, 1) – 或者你可以切换到使用sigaction ,这样可以让你按照你想要的方式设置标志。 你说你不想那样做(为什么?),但是这是我会推荐的。