我正在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
按预期中断。
我错过了什么? 我的代码有什么问题?
注意:用sigaction
replacesignal
不是我正在寻找的。
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
,这样可以让你按照你想要的方式设置标志。 你说你不想那样做(为什么?),但是这是我会推荐的。