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

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

相关推荐
<但凡.5 分钟前
题海拾贝:力扣 138.随机链表的复制
数据结构·算法·leetcode
安大小万23 分钟前
C++ 学习:深入理解 Linux 系统中的冯诺依曼架构
linux·开发语言·c++
dntktop27 分钟前
隐私保护+性能优化,RyTuneX 让你的电脑更快更安全
运维·windows
田梓燊37 分钟前
图论 八字码
c++·算法·图论
九品神元师39 分钟前
jupyter配置说明
linux·ide·jupyter
fajianchen1 小时前
大厂案例——腾讯蓝鲸DevOps类应用的设计与实践
运维·devops
黯然~销魂1 小时前
root用户Linux银河麒麟服务器安装vnc服务
linux·运维·服务器
Tanecious.1 小时前
C语言--数据在内存中的存储
c语言·开发语言·算法
Bran_Liu2 小时前
【LeetCode 刷题】栈与队列-队列的应用
数据结构·python·算法·leetcode
huaweichenai2 小时前
windows下修改docker的镜像存储地址
运维·docker·容器