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

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

相关推荐
Felven4 小时前
A. Shizuku Hoshikawa and Farm Legs
算法
仰泳的熊猫4 小时前
1150 Travelling Salesman Problem
数据结构·c++·算法·pat考试
福尔摩斯张4 小时前
插件式架构:解耦与扩展的艺术与实践(超详细)
linux·服务器·网络·网络协议·tcp/ip
练习时长一年4 小时前
LeetCode热题100(最小栈)
java·算法·leetcode
txzz88885 小时前
CentOS-Stream-10 搭建YUM源Web服务器
linux·运维·centos·yum源·linux系统更新·centos系统更新·自建web yum源
vi121235 小时前
土壤与水分遥感反演技术综述:原理、方法与应用
人工智能·算法·无人机
Molesidy5 小时前
【Linux】基于Imx6ull Pro开发板和platform_device+platform_driver框架的LED驱动设计以及上机测试
linux·驱动开发
智者知已应修善业5 小时前
【蓝桥杯龟兔赛跑】2024-2-12
c语言·c++·经验分享·笔记·算法·职场和发展·蓝桥杯
Tisfy5 小时前
LeetCode 955.删列造序 II:模拟(O(mn)) + 提前退出
算法·leetcode·字符串·题解·遍历
im_AMBER5 小时前
Leetcode 82 每个字符最多出现两次的最长子字符串 | 删掉一个元素以后全为 1 的最长子数组
c++·笔记·学习·算法·leetcode