2.21 alarm函数 2.22setitimer定时器函数

2.21 alarm函数

#include 
unsigned int alarm(unsigned int seconds);
  • 功能:设置定时器(闹钟)。函数调用,开始倒计时,当倒计时为0的时候,
    函数会给当前的进程发送一个信号:SIGALARM

  • 参数:
    seconds: 倒计时的时长,单位:秒。如果参数为0,定时器无效(不进行倒计时,不发信号)。取消一个定时器,通过alarm(0)。

  • 返回值:
    - 之前没有定时器,返回0
    - 之前有定时器,返回之前的定时器剩余的时间

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

    alarm(100) -> 该函数是不阻塞的,可以继续执行其他的代码

#include 
#include 

int main() {

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

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


    //while循环的目的是,过了两秒后,倒计时为0时,函数会给当前的进程发送一个信号:SIGALARM,默认终止当前的进程。
    while(1) {

    }

    return 0;
}

最终效果:
2.21 alarm函数 2.22setitimer定时器函数_第1张图片

1秒电脑能数多少个数?

// 1秒钟电脑能数多少个数?
#include 
#include 
  
/*
    实际的时间 = 内核时间(系统调用) + 用户时间(普通代码执行) + 消耗的时间(IO操作)
    进行文件IO操作的时候比较浪费时间

    定时器,与进程的状态无关(自然定时法)。无论进程处于什么状态,alarm都会计时。
*/

int main() {    

    alarm(1);

    int i = 0;
    while(1) {
        printf("%i\n", i++);
    }

    return 0;
}

2.22setitimer定时器函数

2.21 alarm函数 2.22setitimer定时器函数_第2张图片

#include 
#include 
#include 

// 过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;
}

你可能感兴趣的:(linux)