近来有读者或者会蛊惑,在linux下开发时往往会遇到一些场景,例如:如何让程序运行特定的工夫而后退出?如何在循环肯定的工夫后主动执行某段程序,例如在判断到小孩关上游戏,运行5分钟后主动执行退出脚本?这就波及到中断和计时器的常识了。

通常在linux中咱们能够应用以下两种计时器函数来实现代码

  1. alarm函数
    所需头文件 #include<unistd.h>
    原型:
    unsigned int alarm(unsigned int seconds)

alarm函数给发送一个SIGALRM中断,由signal函数捕获而后解决。
以下是配合signal函数

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>int flag = 0;int main(void){    /*lambda 表达式简略定义一个中断处理函数 */    auto bb = [](int sig) -> void{printf("alarm!\n"); flag=1; return; };    signal(SIGALRM, bb);  //注册捕捉信号的函数,即 交由bb解决    alarm(1);    while (1)    {        if (flag == 1)        {            printf("hhh\n");            return 0;        }    }    return 0;}

【参考:https://linuxhint.com/sigalar...】
下面这个例子中是说,期待2秒当前主动完结循环,这一性能的实现。然而alarm函数一个过程只能有一个定(计)时器,这对于多线程和异步程序来说特地不敌对,同时应用会有抵触和平安问题。
在bb函数里减少alarm(k)能够实现反复发送的性能。然而每一个alarm收回的SIGALRM中断调用的都是bb函数,在不同的线程里是不会做辨别的。而且只能以秒为单位,局限比拟大。

  1. setitimer()
    setitimer()为Linux的API,并非C语言的Standard Library,setitimer()有两个性能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个function,以下程序demo如何应用setitimer()。
    定义:

     #include <sys/time.h> int setitimer( int which,             const struct itimerval *value,                struct itimerval *ovalue );

    ITIMER_REAL:以零碎实在的工夫来计算,它送出SIGALRM信号。
    ITIMER_VIRTUAL:以该过程在用户态下破费的工夫来计算,它送出SIGVTALRM信号。
    ITIMER_PROF:以该过程在用户态下和内核态下所费的工夫来计算,它送出SIGPROF信号。

上面是实例

#include <sys/time.h>#include <signal.h>#include <stdio.h>int main(void){    auto bb = [](int signum) -> void{printf("alarm!\n"); return;};    signal(SIGALRM, bb);    struct itimerval new_one, old_one;     /*******  通过new_one 设置 **********/    /* tv_sec + tv_usec* 1/1e6 = 反复的间隔时间 it_interval 为0时候则始终延时*/     new_one.it_interval.tv_sec = 0;     new_one.it_interval.tv_usec = 3e5;  // 取值 < 1e6     /* 同理,初始执行工夫*/    new_one.it_value.tv_sec = 1;    new_one.it_value.tv_usec = 0; // 取值 < 1e6    setitimer(ITIMER_REAL, &new_one, &old_one); // old_one 不必赋值        for(;;);    printf("1122\n");    return 0;}

后记:有其余实现形式吗,有没有什么注意事项?底层原理是什么?当前有机会持续开掘。