免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2571 | 回复: 4
打印 上一主题 下一主题

求助:网络编程中,read函数处于阻塞状态时的信号中断响应问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-29 10:27 |只看该作者 |倒序浏览
网络编程中,read函数处于阻塞状态,此时被信号中断,但为什么中断处理后,read还继续阻塞?

看书上说,read被中断后会返回-1,不会再阻塞,但我使用的read怎么还继续阻塞呢?
有没有办法让read被信号中断后退出阻塞的?

我使用的环境是:RedHat Linux 8.0,gcc也是RedHat自带的,忘了多少版本。收到的信号是SIGALRM.

现在想到的办法是:信号处理函数中,关掉socket连接的可读属性,让read出错退出,之后再打开socket连接的可读属性。

不知大家怎么看?

论坛徽章:
0
2 [报告]
发表于 2006-12-29 13:38 |只看该作者
这种需求应该用select来做
我也想知道read的阻塞具体是怎么实现的,关于信号那个问题,应该也是判断了errno==EINTER吧

论坛徽章:
0
3 [报告]
发表于 2006-12-29 19:32 |只看该作者

回复 2楼 feasword 的帖子

我在read函数后判断了errno==EINTR,但是read函数根本没退出阻塞,直到接收完数据才退出的,因此read的返回值也不会<0,也就不会执行判断errno是否==EINTR了。

嗯,select会比较适合在这种场合

谢谢

论坛徽章:
0
4 [报告]
发表于 2006-12-29 20:16 |只看该作者
额,select 和 poll/epoll 都能做到。

关于具体的机制,可以参考系统的源代码。《UNIX 操作系统设计》一书,也可供参考之用。

论坛徽章:
0
5 [报告]
发表于 2007-01-02 08:19 |只看该作者
一般情况下,可以设置一个标号来返回到read:

  1. ...
  2. do_read_begin:
  3. if(read(...)==-1) {
  4.         switch(errno) {
  5.         case EINTR:
  6.                 <中断处理>;
  7.                 goto do_read_begin;
  8.         ...
  9.                 }
  10.         }
  11. ...
复制代码

只要errno等于EINTR,那就一定是中断引起,处理完中断就可以直接返回标号,不会引起其它问题,在这里用goto是直接而了当的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP