2.22、setitimer 定时器函数

1.setitimer定时器函数介绍

    #include <sys/time.h>
    int setitimer(int which, const struct itimerval *new_value,
                        struct itimerval *old_value);
    
        - 功能:设置定时器(闹钟)。可以替代alarm函数。精度微妙us,可以实现周期性定时
        - 参数:
            - which : 定时器以什么时间计时
              ITIMER_REAL: 真实时间,时间到达,发送 SIGALRM   常用
              ITIMER_VIRTUAL: 用户时间,时间到达,发送 SIGVTALRM
              ITIMER_PROF: 以该进程在用户态和内核态下所消耗的时间来计算,时间到达,发送 SIGPROF

            - new_value: 设置定时器的属性
            
                struct itimerval {      // 定时器的结构体
	                struct timeval it_interval;  // 每个阶段的时间,间隔时间
	                struct timeval it_value;     // 延迟多长时间执行定时器
                };

                struct timeval {        // 时间的结构体
                    time_t      tv_sec;     //  秒数     
                    suseconds_t tv_usec;    //  微秒    
                };10秒后,每个2秒定时一次
            it_interval = 2
            it_value = 10
           
            - old_value :记录上一次的定时的时间参数,一般不使用,指定NULL
        
        - 返回值:
            成功 0
            失败 -1 并设置错误号

2.setitimer函数实现

  • 以下使用cpp实现(之前都是c)
#include <iostream>
#include <sys/time.h>
#include <cstdlib>

using namespace std;

int main()
{
    //设置3秒之后,每隔两秒设置发送一个信号
    struct itimerval new_value = {{2, 0}, {3, 0}};

    // struct itimerval new_value;

    // 设置间隔时间
    // new_value.it_interval.tv_sec = 2;
    // new_value.it_interval.tv_usec = 0;

    // 设置延迟间隔时间
    // new_value.it_value.tv_sec = 3;
    // new_value.it_value.tv_usec = 0;

    int ret = setitimer(ITIMER_REAL, &new_value, NULL);
    printf("定时器开始执行....\n");
    
    if (ret == -1)
    {
        perror("setitimer");
        exit(0);
    }

    getchar();

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要启动多个定时器,可以使用 `setitimer` 函数来实现。`setitimer` 函数可以设置一个或多个定时器,用于在指定的时间间隔内触发信号。 下面是一个示例代码,演示如何启动多个定时器: ```c #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <signal.h> void timer_handler(int signum) { printf("Timer expired!\n"); } int main() { struct itimerval timer1, timer2; // 设置第一个定时器 timer1.it_value.tv_sec = 1; // 第一次触发的时间间隔为1秒 timer1.it_value.tv_usec = 0; timer1.it_interval.tv_sec = 2; // 之后每次触发的时间间隔为2秒 timer1.it_interval.tv_usec = 0; setitimer(ITIMER_REAL, &timer1, NULL); // 使用实时时间 // 设置第二个定时器 timer2.it_value.tv_sec = 5; // 第一次触发的时间间隔为5秒 timer2.it_value.tv_usec = 0; timer2.it_interval.tv_sec = 5; // 之后每次触发的时间间隔为5秒 timer2.it_interval.tv_usec = 0; setitimer(ITIMER_REAL, &timer2, NULL); // 注册信号处理函数 signal(SIGALRM, timer_handler); // 等待定时器触发 while (1) { // 进行其他操作 } return 0; } ``` 在上述示例中,我们使用了两个不同的 `itimerval` 结构体变量 `timer1` 和 `timer2` 来分别设置两个定时器。然后使用 `setitimer` 函数将这两个定时器设置为实时计时器,并指定了对应的时间间隔。之后,我们注册了信号处理函数 `timer_handler` 来处理定时器触发的信号 `SIGALRM`。 最后,在主函数中使用一个无限循环来等待定时器的触发,可以在循环中进行其他操作。 希望这个示例能帮助到你!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值