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

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

相关推荐
MarcoPage39 分钟前
Python 字典推导式入门:一行构建键值对映射
java·linux·python
未来之窗软件服务2 小时前
服务器运维(六)跨域配置 Preflight 问题——东方仙化神期
运维·服务器·服务器运维·仙盟创梦ide·东方仙盟
埃伊蟹黄面2 小时前
计算机的“身体”与“灵魂”:冯·诺依曼架构与操作系统
linux
winner88814 小时前
Linux 软件安装 “命令密码本”:yum/apt/brew 一网打尽
linux·运维·服务器
九河云4 小时前
软件开发平台 DevCloud
运维·服务器·数据库·科技·华为云
思麟呀5 小时前
Linux的基础IO流
linux·运维·服务器·开发语言·c++
星释5 小时前
Rust 练习册 :Pythagorean Triplet与数学算法
开发语言·算法·rust
星释5 小时前
Rust 练习册 :Nth Prime与素数算法
开发语言·算法·rust
winner88816 小时前
嵌入式Linux驱动开发全流程:工具协作+核心概念拆解(从入门到理解)
linux·运维·驱动开发
ShiinaKaze6 小时前
fatal error: bits/c++config.h: No such file or directory
linux·gcc·g++