简单介绍UNIX下编写定时器程序

简单介绍UNIX下编写定时器程序
   
        刚好写程序的时候要使用定时器,就是定时的做一些操作,网上查了一下,自己也学着写了写,网上倒是说的好多种,我在这里就不做过多介绍了,就说我用的这个,使用 setitimer函数。

函数原型
 int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

参数说明

   参数which
  参数 which是定时器类型

取值

含义

信号发送

ITIMER_REAL

定时真实时间,与alarm类型相同。

SIGALRM

ITIMER_VIRT

定时进程在用户态下的实际执行时间。

SIGVTALRM

ITIMER_PROF

定时进程在用户态和核心态下
的实际执行时间。

SIGPROF


 

   这三种定时器定时完成时给进程发送的信号各不相同,其中ITIMER_REAL类定时器发送SIGALRM信号,ITIMER_VIRT类定时器发送SIGVTALRM信号,ITIMER_PROF类定时器发送SIGPROF信号。

   参数 value
   结构itimerval描述了定时器的组成。
1  struct  itimerval 
2  {
3  struct  timeval  it_interval;    /*  下次定时取值  */
4  struct  timeval  it_value;        /*  本次定时设置值  */
5  }
6 
    结构timeval描述的是精确到微秒的结构。
1  struct  timeval 
2  {
3  long     tv_sec;       /*  秒(1000000微秒)  */
4  long     tv_usec;      /*  微妙  */
5  }
6 

   itimerval结构中的it_value是代表首次定时的时间,而it_interval代表下一次定时的时间,执行完第一次之后,it_interval中的时间会赋值给it_value,周而复始。如果it_value值被设置为0,则定时器停止定时;如果it_value值不为0但it_interval值为0,则定时器在一次定时后终止。
   setitimer执行成功返回0,否则返回-1

参数ovalue
  该参数可以使用空值NULL,如果不为空的话,返回的是上一个时刻的定时器状态。

下面写的一个简单的例子程序。

 1  #include  < stdio.h >
 2  #include  < stdlib.h >
 3  #include  < unistd.h >
 4  #include  < signal.h >
 5  #include  < time.h >
 6  #include  < sys / time.h >
 7 
 8  int  n = 0 ;
 9  void  doAction( int  sig) // 你要做的事情
10  {
11      printf( " 让一切痛苦随风而去 %d\n " ,n ++ );
12      signal(SIGALRM,doAction);
13  }
14  void  setMyTimer( int  val)
15  {
16       struct  itimerval value;
17      value.it_value.tv_sec = val;
18      value.it_value.tv_usec = 0 ;
19      value.it_interval.tv_sec = val;  // val秒
20      value.it_interval.tv_usec = 0 ;
21      signal(SIGALRM, doAction);
22      setitimer(ITIMER_REAL, & value,NULL);
23       while ( 1 );
24  }
25 
26  int  main(  int  argc,  char   ** argv )
27  {
28       if  (argc < 2 )
29      {
30          printf( " 请您输入参数:\n " ); // 第二个参数是定时器的时长的,单位是秒
31           return   - 1 ;
32      }
33       int  val = atoi(argv[ 1 ]);
34      printf( " %d\n " ,val);
35       setMyTimer(val);
36       return   0 ;
37  }

代码就不解释了,就是启动的时候获得第二个参数,用作定时器的时间,然后打印出“让一切痛苦随风去 0”,如此循环。
在AIX5.2下,使用XLC++V7.0编译通过。

运行效果如下
简单介绍UNIX下编写定时器程序_第1张图片

你可能感兴趣的:(简单介绍UNIX下编写定时器程序)