首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >recvfrom()超时值与with ()

recvfrom()超时值与with ()
EN

Stack Overflow用户
提问于 2011-05-08 18:16:14
回答 1查看 3.5K关注 0票数 7

我正在调试以下代码:

代码语言:javascript
复制
signal(SIGALRM, testt);                                                  
alarm(1);                                                                
result = recvfrom( listening_socket, buf, maxlen, 0, &from, &fromlen );  
printf("stoped\n");          

正如man 3 siginterrupt所描述的那样,警报应该中断系统调用,但在我的示例中它没有。

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

如果我在设置警报处理程序之后添加了siginterrupt(SIGALRM, 1);,那么recvfrom就会像预期的那样中断。

我遗漏了什么?我的密码怎么了?

注意:用sigaction代替sigaction不是我想要的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-08 18:28:40

siginterrupt(3)手册是不正确的( Linux手册集的3.33版纠正了错误)。glibc的signal的默认行为是建立一个不中断系统调用的信号。您可以在strace中看到这一点。

代码语言:javascript
复制
void handler(int unused) {}
int main(void)
{
  signal(SIGALRM, handler);
}

代码语言:javascript
复制
$ 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,这将使您首先以您想要的方式设置标志。你说你不想这么做(为什么?)不过,这是我的建议。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5929309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档