狂自私

导航

setitimer函数

和alarm函数类似,都用于定时操作;

函数原型:int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

参数:which是指定的定时方式

①自然定时:ITIMER_REAL 14)SIGLARM                                                 计算自然时间

虚拟空间计时(用户空间):ITIMER_VIRTUAL 26)SIGVTALRM     只计算进程占用cpu的时间

运行时计时(用户+内核):ITIMER_PROF 27)SIGPROF          计算占用cpu及执行系统调用的时间

new_value被const限定,这是一个传入参数;old_value没有const,这是一个传出参数。结构体itimerval是这样的:

struct itimerval {

    struct timeval it_interval; /* Interval for periodic timer */

    struct timeval it_value; /* Time until next expiration */

};

结构体timeval是这样的:

struct timeval {

    time_t tv_sec; /* seconds */

    suseconds_t tv_usec; /* microseconds */

};

为了更好的理解,我写了下面的代码:

#include <stdlib.h>

#include <stdio.h>

#include <sys/time.h>

#include <signal.h>

void mafunc(int signo)

{

    puts("hello, world.");

}

int main(void)

{

    struct itimerval it, oldit;

    signal(SIGALRM, myfunc);//信号捕捉函数,不执行SIGALRM信号的默认动作

    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;

}

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

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

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

posted on 2018-04-05 20:48  狂自私  阅读(1150)  评论(0编辑  收藏  举报