Linux C/C++信号2

35 篇文章 0 订阅
35 篇文章 0 订阅
本文介绍了Linux系统中的两种定时器:alarm和setitimer。alarm函数设置秒级别闹钟,超时后发送SIGALRM信号;setitimer提供更高精度的定时,支持周期性触发,可用于实时应用。通过示例代码展示了如何使用这两个函数进行定时操作。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、定时器alarm和定时器setitimer

alarm
使用a l a r m函数可以设置一个时间值(闹钟时间),在将来的某个时刻该时间值会被超过。当所设置的时间值被超过后,产生 S I G A L R M信号。如果不忽略或不捕捉此信号,则其默认动作是终止该进程。
unsigned int alarm(unsigned int seconds) ;
其中,参数s e c o n d s的值是秒数,经过了指定的s e c o n d s秒后会产生信号S I G A L R M。要了解的是,经过了指定秒后,信号由内核产生,由于进程调度的延迟,进程得到控制能够处理该信号还需一段时间。

setitimer
设置定时器(闹钟)。可以替代alarm函数。精度微秒us,可以实现周期性定时。

int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);
参数:
which:定时器以什么时间计时
ITIMER_REAL:真实时间,时间到达,发送SIGALARM 常用
ITIMER_VIRTUAL:用户实际,实际到达,发送SIGVTALRM
ITIMER_PROF:以该进程在用户态和内核态下所消耗的时间来计算,时间到达,发送SIGPROF
-new_value:设置定时器的属性
-old_value:记录上一次定时的时间参数,一般不使用,NULL

二、alarm的案例

#include<stdio.h>
#include<unistd.h>

int main()
{
    int seconds = alarm(5);
    printf("seconds = %d\n",seconds);

    sleep(2);
    seconds = alarm(2);//不阻塞
    printf("seconds = %d\n",seconds);
    
    while(1)
    {

    }

    return 0;
}

三、setitimer的案例

#include<stdio.h>
#include<stdlib.h>
#include <sys/time.h>

//过三秒以后,每隔2秒定时一次
int main()
{
    struct itimerval new_value;

    //设置间隔的时间
    new_value.it_interval.tv_sec=2;
    new_value.it_interval.tv_usec=0;

    //设置延迟的时间,3秒之后开始第一次定时
    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("setitimer");
        exit(0);
    }

    getchar();

    return 0;
}

总结

今天主要给大家介绍了Linux的2种定时器,alarm主要是设置时间然后到达时间之后开始执行,setitimer主要是先设置延迟时间,然后到达延迟时间后,没间隔多少时间执行一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值