免费注册 查看新帖 |

Chinaunix

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

alarm系统调用一问! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-23 21:54 |只看该作者 |倒序浏览
在一段程序中用到超时退出,(不超时则继续执行)用了alarm系统调用:

  1. main()

  2. {

  3.    int i;
  4.    while(1)
  5.    {
  6.    alarm(2);

  7.    printf("%d\n",i++);

  8.    alarm(0);
  9.    }

  10. }
复制代码

按照我的理解,这种情况下,程序应该不会退出。但是执行的时候,总是打印一段
时间程序就退出了。不知道什么原因?printf执行时间不会超过2秒把?更奇怪的是
,我在alarm(2)后面加上一句sleep(1),它就不退出了!这是何故?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-07-23 22:03 |只看该作者

alarm系统调用一问!

这个程序退出
不是因为它超时了 才退出的. 这个程序执行肯定是不会超过1秒的.(在正常的情况下.)
我把它改了改 看懂了 这个程序 你就明白了.
  1. #include <stdio.h>;
  2. #include <unistd.h>;
  3. #include <signal.h>;
  4. #include <stdlib.h>;

  5. void fn(int sign)
  6. {
  7.     printf("i recv %d\n",sign);
  8.     exit(0);
  9. }
  10. int main()
  11. {
  12.     int i;
  13.     if(signal(SIGALRM,fn)==SIG_ERR)
  14.     {
  15.         perror("signal");
  16.         exit(1);
  17.     }
  18.     alarm(2);
  19.     printf("%d\n",i++);
  20.     sleep(100);
  21.     alarm(0);
  22.     exit(0);
  23. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2005-07-23 22:31 |只看该作者

alarm系统调用一问!

mp110能告诉一下你的程序是怎么运行的吗

论坛徽章:
0
4 [报告]
发表于 2005-07-23 22:32 |只看该作者

alarm系统调用一问!

mq110能告诉一下你的程序是怎么运行的吗

论坛徽章:
0
5 [报告]
发表于 2005-07-23 22:53 |只看该作者

alarm系统调用一问!

你要通过signal来处理你的alarm产生的信号阿
不过现在一般是用sigaction

论坛徽章:
0
6 [报告]
发表于 2005-07-23 23:10 |只看该作者

alarm系统调用一问!


  1. #include <stdio.h>;
  2. #include <unistd.h>;
  3. #include <signal.h>;
  4. #include <stdlib.h>;
  5. static int counter;    //全局静态变量
  6. void fn(int signo)     //ALRM信号调用的函数
  7. {
  8.    counter++;
  9.    write(1,"CAUGHT SIGALRM\n",15);
  10.    //用write是因为它可重入
  11.    exit(0);
  12. }
  13. int main()
  14. {
  15.    int i;
  16.    sigset_t  sigs;   
  17.    struct  sigaction  sa_old;     
  18.    //保存信号响应原来的值,可以理解为保护现场?
  19.    struct  sigaction  sa_new;
  20.    //定义新的信号响应
  21.   counter=0;//初始化counter;
  22.    sa_new.sa_handler=fn;
  23.    //绑定响应的函数
  24.    sigemptyset(&sa_new.sa_mask);
  25.    //阻塞并初始化信号集,这里没有经过什么特殊设置
  26.    sa_new.sa_flags=0;
  27.    //这个好像没什么特殊的要求
  28.    sigaction(SIGALRM,&sa_new,&sa_old);
  29.    //SIGALRM建立新的信号响应
  30.    alarm(2);
  31.    i=0;
  32.    do{
  33.               printf("%d\n",i++); //如果时间长了i会溢出
  34.    }while(counter<1);  
  35.    alarm(0);
  36.    exit(0);
  37. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2005-07-24 00:22 |只看该作者

alarm系统调用一问!

原帖由 "netcalf" 发表:

在一段程序中用到超时退出,(不超时则继续执行)用了alarm系统调用:

main()

{

   int i;

   alarm(2);

   printf("%d\n",i++);//你的i不要出始化?

   alarm(0);

}

按照我的理解,这种情况下,程序应该不会退出

但是为什么退出了呢?
你又没有循环,为什么不退出?
alarm(2)只是在两秒中之后发SIGALRM信号而已
这个程序是你自己写的?谁教的?
书上的?我怎么没看到过?

论坛徽章:
0
8 [报告]
发表于 2005-07-24 00:24 |只看该作者

alarm系统调用一问!

  1. 但是执行的时候,总是打印一段
  2. 时间程序就退出了。
复制代码

这个程序要是能重复打印一段时间就来鬼了(._.!)

论坛徽章:
0
9 [报告]
发表于 2005-07-24 00:40 |只看该作者

alarm系统调用一问!

另外库函数sleep()同样调用了alarm()函数,所以在同一进程中,不要同时混用这两个函数,否则sleep()可能会取消掉alarm()的设置

论坛徽章:
0
10 [报告]
发表于 2005-07-24 10:31 |只看该作者

alarm系统调用一问!

超级大灌水啊,呵呵,有话一气儿说啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP