请教关于Linux下socket描述字操作超时的问题

发布于 2022-07-19 03:16:07 字数 353 浏览 14 评论 2

在《Unix网络编程》中指出判断套接字超时有三种方法:
1. 用alarm设置超时
2. 用select
3. 使用套接字选项中的SO_RCVTIMEO和SO_SNDTIMEO套接字的处理

我使用的是第一种方法,但是在移植到linux下发现有问题,经过测试发现当ALARM信号发生的时候,
用来读取的read()调用无法被中断,导致我的socket接收一直无法超时。

其实这个问题在Linux下处理其他描述字的时候也是一样,一旦这个描述字被设置为堵塞模式,她的read操作就无法被ALARM信号中断了。

我不知道是否和描述字的属性有关,如何设置其属性使其可以对ALARM信号敏感。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

随遇而安 2022-07-21 20:25:23

我按照你说的用sigaction去替代了signal, 果然达到需要的效果。
究其原因应该是在sigaction 中可以设置 sa.flags中的一些选项,其中一个使SA_RESTART的标识,当这个标识生效的时候,所有系统调用被该信号中断后会被重新调用。
详细的说明和代码的例子在《unix环境高级编程》的第10章中有详细介绍。

醉酒的小男人 2022-07-21 19:56:43

要是你使用了signal的话,
换成sigaction试试。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文