免费注册 查看新帖 |

Chinaunix

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

[函数] 请教一个alarm(0)的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-28 00:41 |只看该作者 |倒序浏览
下面这段程序是书上写的,作用是若10S内有输入,程序正常返回,若没有输入,则进入sgig_alrm函数;

我不太理解那个alarm(0),按书上的理解,这个alarm(0)的意思是取消之前的alarm闹钟,不返回SIGALRM;

我是这样理解的 :这段代码先alarm(10);然后走完两个if语句,这用不了10秒吧 ?然后就到了alarm(0),取消了之前的alarm(10)
这段代码我的理解是否有问题 ?

  1. #define MAXLINE 4096

  2. int main(void)
  3. {
  4.     int n;
  5.     char line[MAXLINE];
  6.     /*设定超时时限*/
  7.     alarm(10);
  8.     /*信号注册函数*/
  9.     if(signal(SIGALRM, sig_alrm) == SIG_ERR)
  10.         perror("signal");
  11.     if((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
  12.         perror("read");
  13.     alarm(0);
  14.    
  15.     write(STDOUT_FILENO, line, n);
  16.     exit(0);
  17. }

  18. static void sig_alrm(int signo)
  19. {
  20.     printf("in here alarm\n");
  21. }
复制代码



#############
我觉得应该这样修改,不对的地方请指正


  1. #define MAXLINE 4096

  2. int main(void)
  3. {
  4.     int n;
  5.     char line[MAXLINE];
  6.     /*设定超时时限*/
  7.     alarm(10);
  8.     /*信号注册函数*/
  9.     if(signal(SIGALRM, sig_alrm) == SIG_ERR)
  10.         perror("signal");
  11.     if((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
  12.         perror("read");
  13.     else
  14.         alarm(0);            //read()的返回值大于0,则不需要返回SIGALRM信号,所以调用alarm(0)取消之前的alarm(10)
  15.    
  16.     write(STDOUT_FILENO, line, n);
  17.     exit(0);
  18. }

  19. static void sig_alrm(int signo)
  20. {
  21.     printf("in here alarm\n");
  22. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2009-06-28 01:24 |只看该作者
if((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
应该这里会阻塞

论坛徽章:
0
3 [报告]
发表于 2009-06-28 08:44 |只看该作者

回复 #2 gawk 的帖子

用个循环吧.

论坛徽章:
0
4 [报告]
发表于 2009-06-28 10:07 |只看该作者

回复 #2 gawk 的帖子

read()处会阻塞 ?
是不是open 函数打开STDIN_FILENO的时候,不加O_NONBLOCK,就是阻塞打开的,
所以read的时候会阻塞

不知我理解的对不对

论坛徽章:
0
5 [报告]
发表于 2009-06-28 10:41 |只看该作者
你代码在上运行过没有?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP