• setitimer()


    setitimer()为Linux的API,并非C语言的Standard Library,setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个function,以下程序demo如何使用setitimer()。

    1. /* 
    2.  
    3.   
    4.  
    5. Filename    : timer.cpp 
    6.  
    7. Compiler    : gcc 4.1.0 on Fedora Core 5 
    8.  
    9. Description : setitimer() set the interval to run function 
    10.  
    11. Synopsis    : #include <sys/time.h> 
    12.  
    13.               int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue); 
    14.  
    15.               struct itimerval { 
    16.  
    17.                 struct timerval it_interval; 
    18.  
    19.                 struct timerval it_value; 
    20.  
    21.               }; 
    22.  
    23.   
    24.  
    25.               struct timeval { 
    26.  
    27.                 long tv_sec; 
    28.  
    29.                 long tv_usec; 
    30.  
    31.               }             
    32.  
    33. Release     : 11/25/2006 
    34.  
    35. */  
    36.  
    37. #include <stdio.h>    // for printf()  
    38.  
    39. #include <unistd.h>   // for pause()  
    40.  
    41. #include <signal.h>   // for signal()  
    42.  
    43. #include <string.h>   // for memset()  
    44.  
    45. #include <sys/time.h> // struct itimeral. setitimer()  
    46.   
    47.   
    48.   
    49. void printMsg(int);  
    50.   
    51.   
    52.   
    53. int main() {  
    54.   
    55.   // Get system call result to determine successful or failed  
    56.   
    57.   int res = 0;  
    58.   
    59.   // Register printMsg to SIGALRM  
    60.   
    61.   signal(SIGALRM, printMsg);  
    62.   
    63.     
    64.   
    65.   struct itimerval tick;  
    66.   
    67.   // Initialize struct  
    68.   
    69.   memset(&tick, 0, sizeof(tick));  
    70.   
    71.   // Timeout to run function first time  
    72.   
    73.   tick.it_value.tv_sec = 1;  // sec  
    74.   
    75.   tick.it_value.tv_usec = 0; // micro sec.  
    76.   
    77.   // Interval time to run function  
    78.   
    79.   tick.it_interval.tv_sec = 1;  
    80.   
    81.   tick.it_interval.tv_usec = 0;  
    82.   
    83.   // Set timer, ITIMER_REAL : real-time to decrease timer,  
    84.   
    85.   //                          send SIGALRM when timeout  
    86.   
    87.   res = setitimer(ITIMER_REAL, &tick, NULL);  
    88.   
    89.   if (res) {  
    90.   
    91.     printf("Set timer failed!!/n");  
    92.   
    93.   }  
    94.   
    95.   
    96.   
    97.   // Always sleep to catch SIGALRM signal  
    98.   
    99.   while(1) {  
    100.   
    101.     pause();  
    102.   
    103.   }  
    104.   
    105.   
    106.   
    107.   return 0;    
    108.   
    109. }  
    110.   
    111.   
    112.   
    113. void printMsg(int num) {  
    114.   
    115.   printf("%s","Hello World!! ");  
    116.   
    117. }  

    当setitimer()所执行的timer时间到了,会呼叫SIGALRM signal,所以在第30行用signal()将要执行的function指定给SIGALRM。 在第43行呼叫setitimer()设定timer,但setitimer()第二个参数是sturct,负责设定timeout时间,所以第36行到第 40行设定此struct。itimerval.it_value设定第一次执行function所延迟的秒数, itimerval.it_interval设定以后每几秒执行function,所以若只想延迟一段时间执行function,只要设定 itimerval.it_value即可,若要设定间格一段时间就执行function,则it_value和it_interval都要设定,否则 funtion的第一次无法执行,就别说以后的间隔执行了。 第36行和第39行的tv_sec为sec,第37行和40行为micro sec(0.001 sec)。 第43行的第一个参数ITIMER_REAL,表示以real-time方式减少timer,在timeout时会送出SIGALRM signal。第三个参数会存放旧的timeout值,如果不需要的话,指定NULL即可。 第47 行的pause(),命令系统进入sleep状态,等待任何signal,一定要用while(1)无穷循环执行pause(),如此才能一直接收 SIGALRM signal以间隔执行function,若拿掉while(1),则function只会执行一次而已。

  • 相关阅读:
    微信小程序非域名测试环境,手机预览不正常,模拟器和真机调试正常解决办法
    vue 建项目及初步开发遇到的问题
    开发&测试
    架构&项目
    运维
    读书&源码
    ArrayList
    jdk集合知识点整理
    jdk集合关系图
    jvm知识点整理
  • 原文地址:https://www.cnblogs.com/zhouhbing/p/4133296.html
Copyright © 2020-2023  润新知