Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101506
  • 博文数量: 14
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 206
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-28 09:37
个人简介

记录我自己的成长....

文章分类

全部博文(14)

文章存档

2014年(2)

2013年(12)

我的朋友

分类: LINUX

2013-10-25 21:21:28

实验内容:
      编写程序,使程序每隔500ms输出一条消息,类似单片机中的闪烁led的程序。

1、第一种实现方法
     最简单的一种方式是用usleep系统调用。
         #include
         int usleep(useconds_t usec);
     暂停执行usec微妙,如果要实现间隔500ms输出一条信息,这将500000作为参数传入usleep中就可实现此功能,
     代码如下:timer1.c
    

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <unistd.h>

  3. int main(void)
  4. {
  5.   while (1) {
  6.     printf("ON\n");
  7.     usleep(500000);
  8.     printf("OFF\n");
  9.     usleep(500000);
  10.   }
  11. }


2、用间隔计时器,
  
   实验中用的系统调用函数有,
     #include
     typedef void (*sighandler_t)(int);
     sighandler_t signal(int signum, sighandler_t handler);
   使用这个函数来安装消息处理函数,第一个参数是消息号,在实验中是SIGALRM,第二个参数是一个函数类型,用它来指定了消息处理函数。
   在我的实验中我signel函数指定SIGALRM信号的处理函数,当时间用尽时发送消息,进行消息处理,来输出ON/OFF信息。  

     #include
     int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
  
  使用这个函数设定间隔计时器的值。
   系统为每个进程提供三种间隔计时器,每种计时器时间用尽时都会给进程发送相应的信号。
   这三种计时器通过setitimer的第一个参数which来指定,
   这三种间隔计时器所计的时间分别为:

     真实时间——当which为ITIMER_REAL时,表示是真实时间,这个时间和手表上的时间一样。当真实时间用尽时会发送一个SIGALRM消息。
     进程时间——当which为ITIMER_VIRTUAL时,是指进程在用户态执行的时间。当进程时间用尽时会发送一个SIGVTALRM消息。
     实用时间——当which为ITIMER_PROF时,是指进程在用户态和核心态执行的时间。当实用时间用尽时会发送一个SIGPROF消息。
    对于这个三个时间,我的理解是,在一个进程生存周期内,其在内核态执行时,所用的时间是内核时间,在用户态执行的时间为用户时间,除去这个两个活动时间
    进程还有休眠时间,而真实时间,是我们日常生活中所用的时间,比如1分钟。对于进程来讲,真实时间就是内核时间和用户时间以及休眠时间的和。实用时间是进程
    占用处理器执行的时间,包含内核态和用户态。

   第二个参数是一个结构变量,这个结构的定义如下:
     struct itimerval {
       struct timeval it_interval;
       struct timeval it_value;
     }
    
     struct timeval {
       long tv_sec;
       long tv_usec;
     }
   在这个结构中it_interval的值是用来当it_value的减到0时,被重新加载到it_value中,而it_value的值就是计数的值。

   第三个参数是用来保存原来的itimerval的值的,可以设定为NULL,不保持原来的itimerval的值。
  
3、实验的代码
  

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <signal.h>
  4. #include <sys/time.h>
  5. #include <stdlib.h>

  6. void set_timer(int msec);

  7. void timer_handle()
  8. {
  9.   static int flag = 0;

  10.   if (flag)
  11.     printf("ON\n");
  12.   else
  13.     printf("OFF\n");
  14.   flag = 1-flag;
  15. }

  16. int main(void)
  17. {
  18.   signal(SIGALRM, timer_handle);
  19.  set_timer(500);
  20.   while (1)
  21.     pause();
  22.   printf("exit\n");
  23. }

  24. void set_timer(int msec)
  25. {
  26.   struct itimerval timeval;

  27.   timeval.it_value.tv_sec = msec/1000;
  28.   timeval.it_value.tv_usec = (msec%1000)*1000;

  29.  timeval.it_interval = timeval.it_value;
  30. // timeval.it_interval.tv_sec = 0;
  31. // timeval.it_interval.tv_usec = 0;
  32.   setitimer(ITIMER_REAL, &timeval, NULL);
  33. }
   代码包包含两部分的代码,timer1.c 和 timer2.c,放在百度网盘上,名字为timer.tar.bz2
   下载地址



阅读(2313) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~