linux 定时函数setitimer使用

2019-07-13 06:56发布

linux 定时函数setitimer使用

  • 头文件
#include
  • 函数原型
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
第一个参数:which表示类型:
ITIMER_REAL:以系统真实的时间来计算,计时到期后发出SIGALRM信号。
ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,计时到期后发出SIGVTALRM信号。
ITIMER_PROF:以该进程在用户态下和内核态下所费的时间来计算。计时到期后发出SIGPROF信号。
第二个参数:new_value用来对计时器进行延时设置,it_interval为计时间隔,it_value为延时时长。
第三个参数:old_value通常设置为NULL,用来存储上一次setitimer调用时设置的new_value值。
返回值:成功返回0, 失败返回-1。
itimerval结构体 struct itimerval { struct timeval it_interval; /* Interval for periodic timer */ struct timeval it_value; /* Time until next expiration */ }; struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ }; settimer工作机制是,先对it_value倒计时,当it_value为零时会触发信号,然后重置为it_interval,继续对it_value倒计时。一直这样循环下去。
基于此机制。setitimer既能够用来延时运行,也可定时运行。

注意:如果将it_value设置为0将不会触发信号,而it_interval为0则不会定时。

  • 例子
#include #include #include #include #define COUNT_SEC 1 #define COUNT_USEC 0 static void Timer_Test(int sig) { printf("This is a Test "); } /*Initialize timer*/ static void Init_timer(struct itimerval *tick) { int ret; memset(tick, 0, sizeof(struct itimerval)); /*initialize it_value*/ tick->it_value.tv_sec = COUNT_SEC; tick->it_value.tv_usec = COUNT_USEC; /*initialize it_interval*/ tick->it_interval.tv_sec = COUNT_SEC; tick->it_interval.tv_usec = COUNT_USEC; return; } int main(int argc, const char * argv []) { int ret = 0; struct itimerval tick; signal(SIGALRM, Timer_Test); Init_timer(&tick); ret = setitimer(ITIMER_REAL, &tick, NULL); if(ret < 0) { perror("setitimer"); return -1; } for (;;); //此处循环使主函数不结束。主函数结束后定时函数也将结束。 return 0; }