Advertisement

Linux--alarm与setitimer两个定时函数

阅读量:

alarm函数和setitimer函数都可以触发14号SIGALRM信号

alarm

复制代码
    #include <unistd.h>
    
    unsigned int alarm(unsigned int seconds);  //参数为定时的秒

注意:alarm只会触发一次。

示例程序:

复制代码
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<signal.h>
    void handler(int s) {
     printf("time out!\n");
    }
    int main() {
     signal(SIGALRM, handler);
     alarm(3);   //3秒后发出14号SIGALRM信号,去执行handler函数
     for (;;) {
      printf(".");
      fflush(stdout);
      sleep(1);
     }
    }

setitimer

复制代码
    #include <sys/time.h>
    
    int setitimer(int which, const struct itimerval *new_value,
    		struct itimerval *old_value);
    //第一个参数代表何种计时方式,ITIMER_REAL代表以桌面时间计时。
    //第二个参数代表设置的定时器。
    //第三个参数代表如过你设置了新的计时器,返回旧的计时器。一般不用就写NULL

其中第二个参数的结构体内容如下:

复制代码
    struct itimerval {
           struct timeval it_interval; /* next value定时的间隔时间 */
           struct timeval it_value;    /* current value第一次启动的时间 */
       };
    struct timeval {
          time_t      tv_sec;         /* seconds 秒*/
          suseconds_t tv_usec;        /* microseconds 微妙*/
       };
       //如果秒跟微秒同时为0代表永不启动。
       //一般想要立即启动计时器,那就把秒设为0,微妙设为1.

示例程序:

复制代码
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<signal.h>
    #include<sys/time.h>
    
    void handler(int s) {
     printf("time out\n");
    }
    
    int main() {
     signal(SIGALRM, handler);
     
     struct itimerval it;
     
     it.it_value.tv_sec = 0;
     it.it_value.tv_usec = 1;  //1微秒后启动
     it.it_interval.tv_sec = 3;  //每隔三秒发一次时钟信号
     it.it_interval.tv_usec = 0;
     
     setitimer(ITIMER_REAL, &it, NULL);
     for (;;) {
      printf(".");
      fflush(stdout);
      sleep(1);
     }
     return 0;
    }

全部评论 (0)

还没有任何评论哟~