免费注册 查看新帖 |

Chinaunix

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

【请教】read被中断后的返回值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-08 22:11 |只看该作者 |倒序浏览
代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>
  4. #include <errno.h>

  5. #define MAXLINE 1024

  6. static void sig_alrm(int);

  7. int
  8. main(void)
  9. {
  10.     int     n;
  11.     char    line[MAXLINE];

  12.     if (signal(SIGALRM, sig_alrm) == SIG_ERR) {
  13.         printf("signal(SIGALRM) error\n");
  14.         exit(1);
  15.     }

  16.     alarm(10);
  17.     if ((n = read(fileno(stdin), line, MAXLINE)) < 0) {
  18.         printf("read error:%s\n", strerror(errno));
  19.         exit(0);
  20.     }
  21.     alarm(0);

  22.     write(fileno(stdout), line, n);
  23.     exit(0);
  24. }

  25. static void
  26. sig_alrm(int signo)
  27. {
  28.     printf("alrm\n");
  29.     /* nothing to do, just return to interrupt the read */
  30. }
复制代码
什么都不输入或者输入几个字符,等待alrm信号。
信号产生后,打印alrm,然后read继续阻塞,没有按照预期退出程序。
可是我看了read的man手册,说read被信号打断后会返回-1,
这里为什么没有返回呢?
环境:2.6.38.8-32.fc15.i686 #1 SMP

论坛徽章:
0
2 [报告]
发表于 2011-07-08 23:02 |只看该作者
本帖最后由 wenjianhn 于 2011-07-08 23:03 编辑

read没有被信号打断,而是在内核自动重新执行

UNP 10.5 中断的系统调用 page 244
深入理解linux内核 系统调用的重新执行 page 445

代码中的EINTR是为了鲁棒性

论坛徽章:
0
3 [报告]
发表于 2011-07-09 08:57 |只看该作者
在Unix环境高级编程中,列出了哪些系统函数在中断后能自启动的,而read正好在里面,不知道这样的描述对不对……

论坛徽章:
0
4 [报告]
发表于 2011-07-09 11:05 |只看该作者
回复 2# wenjianhn


   恩 了解了。

   read被中断后,被内核重启了。 在fedora 上是这样的。 在ubuntu上不是, 也就是说各个发行版实现不一样。而且可以使用sigaction来指定被中断的系统调用是否重启。

论坛徽章:
0
5 [报告]
发表于 2011-07-18 11:35 |只看该作者
回复 4# zhanglistar


我的环境:   
DISTRIB_DESCRIPTION="Ubuntu 11.04"
2.6.38-10-generic

运行你的代码,没有被中断
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP