免费注册 查看新帖 |

Chinaunix

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

read()读过程中会接受信号吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-05 22:20 |只看该作者 |倒序浏览
是这段代码,完善read()函数的:
  1. ssize_t ret;
  2. while(len!=0 && (ret=read(fd, buf, len))!=0){
  3.         if(ret==-1){
  4.                 if(errno==EINTR)
  5.                         continue;
  6.                 perror("read");
  7.                 break;
  8.         }
  9.         len -= ret;
  10.         buf += ret;
  11. }
复制代码

书上说这个段程序处理的read的5中返回值情况,我不明白的是当返回-1并且errno=EINTR的过程是什么样子的。
按照程序来,errno=EINTR时不会对len和buf做任何操作而是重新调用read()。如果已经读了一些数据然后被中断了,这时不对len和buf操作,会不会有混乱?由于文件指针已经移动了,再次read会和预期的不一样,虽然还是一样的len。
有两个疑点:
1,读的过程中不会出现信号中断?
2,读的过程中可以产生中断,但是中断后文件指针会返回到read执行前的位置?

论坛徽章:
0
2 [报告]
发表于 2010-04-06 15:56 |只看该作者
本帖最后由 memorymyann 于 2010-04-06 15:59 编辑

1.信号中断的出现和读的过程没有什么关系,我想你问的应该是读的过程会不会响应信号中断。如果你没作出特殊处理(比如屏蔽信号),读的过程会响应信号。

2.读的过程如果响应了信号,当信号处理返回后,会从read函数错误返回,此时read就会返回-1,也就是ret = -1,程序会进入5里面。文件指针在数据被正确的从内核缓冲转移到应用程序缓冲时候才会移动。而错误返回时候文件指针不会移动。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP