首页 > 其他 > 详细

setitimer()函数

时间:2019-09-24 14:24:06      阅读:103      评论:0      收藏:0      [点我收藏+]

和alarm函数类是,用于定时操作。

函数原型为

int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

其中which参数表示类型,可选的值有: 

  1. ITIMER_REAL:以系统真实的时间来计算,它送出SIGALRM信号。 
  2. ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
  3. ITIMER_PROF:以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。

old_value的值一般为NULL。

settimer工作机制是,先对it_value倒计时,当it_value为零时触发信号,然后重置为it_interval,继续对it_value倒计时,一直这样循环下去。

/***
setitimer.c
***/
#include<stdio.h>
#include<stdlib.h>
#include<sys/time.h>
#include<signal.h>

void myfunc(int signo)
{
    puts("hello world.");
}

int main()
{
    struct itimerval it,oldit;
    signal(SIGALRM,myfunc);

    it.it_value.tv_sec = 5;
    it.it_value.tv_usec = 0;

    it.it_interval.tv_sec = 3;
    it.it_interval.tv_usec = 0;

    if(setitimer(ITIMER_REAL,&it,&oldit) == -1)
    {
        perror("setitimer error ");
        exit(1);
    }

    while(1);
    return 0;
}

运行结果:

root@ubuntu:/mnt/hgfs/ShareWindows/shiyanlou/C/Flappy_Bird# gcc setitimer.c -o setitimer

root@ubuntu:/mnt/hgfs/ShareWindows/shiyanlou/C/Flappy_Bird# ./setitimer

hello world.

hello world.

hello world.

hello world.

hello world.

hello world.

^C

执行之后,间隔5秒之后打印hello,world。然后在间隔三秒打印,后续的都是间隔3秒。

 

这里我们知道:new_value.it_interval是用来控制第一次定时时长,new_value.it_value是用来定时后续定时的时长,并且是程序不死就连续定时(即,信号被我们捕捉,不执行默认动作了)。

 

如果想知道定时器还有多久定到时间,再次调用setitimer函数,取出old_value可查看。

 

setitimer()函数

原文:https://www.cnblogs.com/wanghao-boke/p/11577919.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!