Chinaunix

标题: 请教一个alarm(0)的问题 [打印本页]

作者: cir2633    时间: 2009-06-28 00:41
标题: 请教一个alarm(0)的问题
下面这段程序是书上写的,作用是若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. }
复制代码

作者: gawk    时间: 2009-06-28 01:24
if((n = read(STDIN_FILENO, line, MAXLINE)) < 0)
应该这里会阻塞
作者: aaaaa5aa    时间: 2009-06-28 08:44
标题: 回复 #2 gawk 的帖子
用个循环吧.
作者: cir2633    时间: 2009-06-28 10:07
标题: 回复 #2 gawk 的帖子
read()处会阻塞 ?
是不是open 函数打开STDIN_FILENO的时候,不加O_NONBLOCK,就是阻塞打开的,
所以read的时候会阻塞

不知我理解的对不对
作者: gawk    时间: 2009-06-28 10:41
你代码在上运行过没有?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2