Linux 信号 alarm函数 setitimer函数

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

    SIGALARM:默认终止当前的进程,每一个进程有且仅有唯一的定时器

    函数不阻塞
*/
#include<stdio.h>
#include<unistd.h>
int main() {
    int second = alarm(5);
    printf("seconds = %d\n", second);
    sleep(2);
    second = alarm(2);
    printf("seconds = %d\n", second);

    while(1){

    }
    return 0;
}

后面新设的定时器会取代老的定时器

定时与进程的状态无关,无论进程是阻塞,挂起,就绪,运行定时器都是自己玩自己的

setitimer函数

/*
    #include <sys/time.h>
    int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
    功能:设置定时器(闹钟)。可以替代alarm函数。精度微秒,可以实现周期性的定时。
    参数:
        -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;       微秒
            };
        -old_value:记录上次定时的时间参数
    返回值:成功0  失败-1
*/
#include <sys/time.h>
#include<stdio.h>
#include<unistd.h>

int main() {

    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("ret");
        return 0;
    }
    while(1) {
        printf("1\n");
        sleep(1);
    }
    return 0;
}

延迟三秒开始执行就会立马发送信号,然后每隔两秒发送一次

相关推荐
幺零九零零42 分钟前
【C++】socket套接字编程
linux·服务器·网络·c++
TangKenny44 分钟前
计算网络信号
java·算法·华为
景鹤44 分钟前
【算法】递归+深搜:814.二叉树剪枝
算法
iiFrankie1 小时前
SCNU习题 总结与复习
算法
wclass-zhengge1 小时前
Docker篇(Docker Compose)
运维·docker·容器
李启柱1 小时前
项目开发流程规范文档
运维·软件构建·个人开发·设计规范
Dola_Pan2 小时前
C++算法和竞赛:哈希算法、动态规划DP算法、贪心算法、博弈算法
c++·算法·哈希算法
小林熬夜学编程2 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
力姆泰克2 小时前
看电动缸是如何提高农机的自动化水平
大数据·运维·服务器·数据库·人工智能·自动化·1024程序员节
BPM_宏天低代码2 小时前
低代码 BPA:简化业务流程自动化的新趋势
运维·低代码·自动化