请教关于Linux下socket描述字操作超时的问题
在《Unix网络编程》中指出判断套接字超时有三种方法:
1. 用alarm设置超时
2. 用select
3. 使用套接字选项中的SO_RCVTIMEO和SO_SNDTIMEO套接字的处理
我使用的是第一种方法,但是在移植到linux下发现有问题,经过测试发现当ALARM信号发生的时候,
用来读取的read()调用无法被中断,导致我的socket接收一直无法超时。
其实这个问题在Linux下处理其他描述字的时候也是一样,一旦这个描述字被设置为堵塞模式,她的read操作就无法被ALARM信号中断了。
我不知道是否和描述字的属性有关,如何设置其属性使其可以对ALARM信号敏感。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我按照你说的用sigaction去替代了signal, 果然达到需要的效果。
究其原因应该是在sigaction 中可以设置 sa.flags中的一些选项,其中一个使SA_RESTART的标识,当这个标识生效的时候,所有系统调用被该信号中断后会被重新调用。
详细的说明和代码的例子在《unix环境高级编程》的第10章中有详细介绍。
要是你使用了signal的话,
换成sigaction试试。