linux 定时函数setitimer使用

linux 定时函数setitimer使用

  • 头文件
#include <sys/time.h>
  • 函数原型
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 <stdio.h>
#include <string.h>
#include <signal.h>
#include <sys/time.h>

#define COUNT_SEC 1
#define COUNT_USEC 0

static void Timer_Test(int sig)
{
    printf("This is a Test\n");
}

/*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;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值