【Linux】alarm 函数和 setitimer 函数

橙色

alarm函数

1、函数介绍

/*
    #include <unistd.h>
    unsigned int alarm(unsigned int seconds);
        - 功能:设置定时器(闹钟)。函数调用,开始倒计时,当倒计时为0的时候,
                函数会给当前的进程发送一个信号:SIGALARM
        - 参数:
            seconds: 倒计时的时长,单位:秒。如果参数为0,定时器无效(不进行倒计时,不发信号)。
                    取消一个定时器,通过alarm(0)- 返回值:
            - 之前没有设置定时器的话,返回0
            - 之前设置有定时器的话,返回之前的定时器剩余的时间

    - SIGALARM :默认终止当前的进程,每一个进程都有且只有唯一的一个定时器。
        alarm(10);  -> 返回0
        过了1秒
        alarm(5);   -> 返回9

    alarm(100) -> 该函数是不阻塞的
*/

2、代码示例

alarm.c的内容如下:

#include <stdio.h>
#include <unistd.h>

int main() {
    
    

    int seconds = alarm(5);
    printf("seconds = %d\n", seconds);  // 0

    sleep(2);
    seconds = alarm(2);    // 不阻塞
    printf("seconds = %d\n", seconds);  // 3

    while(1) {
    
    
    }

    return 0;
}

该程序首先定时了5秒,随后在睡眠了两秒后,又定时为两秒,同时在最后放了个死循环,等到两秒的时间一到,alarm函数向该进程发送SIGALARM信号,终止死循环。程序结束
在这里插入图片描述

setitimer函数

1、函数介绍

/*
    #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秒(it_value=10)后,每隔2秒(it_interval=2)定时一次
           
            - old_value :记录上一次的定时的时间参数,一般不使用,指定NULL
        
        - 返回值:
            成功 0
            失败 -1 并设置错误号
*/

代码示例

#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>

// 过3秒以后,每隔2秒钟定时一次
int main() {
    
    

    struct itimerval new_value;

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

    // 设置延迟的时间,3秒之后开始第一次定时
    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;
}

一执行程序,“定时器开始了...”被立刻打印出来,说明该函数是非阻塞的。接着三秒过后,该函数直接发送SIGALRM信号,把进程杀死结束(这里没学信号捕捉函数,所以定时功能没办法体现)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mhyasadj/article/details/130761972
今日推荐