recvfrom()超时报警()

Ale*_*dru 7 linux posix signals alarm

我正在调试以下代码:

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

man 3 siginterrupt警报所描述的那样应该中断系统调用,但在我的情况下它不会.调用警报处理程序,但recvfrom不会中断.

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

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

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

注意:更换signalsigaction是不是我要找的.

zwo*_*wol 9

siginterrupt(3)手册页是不正确的(3.33版本的Linux联机帮助页一套纠正错误).glibc的默认行为signal是建立一个不会中断系统调用的信号.你可以通过以下方式看到这个strace:

void handler(int unused) {}
int main(void)
{
  signal(SIGALRM, handler);
}
Run Code Online (Sandbox Code Playgroud)

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

注意那里的SA_RESTART.您可以继续执行您正在执行的操作 - siginterrupt(SIGALRM, 1)在建立处理程序后调用- 或者您可以切换到使用sigaction,这将允许您首先按照您想要的方式设置标记.你说过你不想这样做(为什么?)但是这就是我所推荐的.