Linux定时函数介绍

本文介绍了Linux定时函数。在程序开发中,时间精度要求不高时可用sleep、usleep函数。若不想进程阻塞,可使用alarm和setitimer函数实现定时功能。文中详细分析了这两个函数,包括alarm函数的信号发送,以及setitimer函数的高精度定时和三种内部定时器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux定时函数介绍:

在程序开发过程中,我们时不时要用到一些定时器,通常如果时间精度要求不高,可以使用sleep,uslepp函数让进程睡眠一段时间来实现定时,前者单位为秒(s),后者为微妙(us);但有时候我们又不想让进程睡眠阻塞在哪儿,我们需要进程正常执行,当到达规定的时间时再去执行相应的操作,

在linux下面我们一般使用alarm函数跟setitimer函数来实现定时功能;

下面对这两个函数进行详细分析:

(1)alarm函数

alarm也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它向进程发送SIGALRM信号;

alarm函数原型如下:

	unsigned int alarm(unsigned int seconds);
	 
	 //seconds 为指定的秒数

返回值:
成功:如果调用此alarm()前,进程已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。
出错:-1
下面是alarm()函数的简单例子:

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

	void func()
	{
    printf("this is func\n");
	}

	int main()
	{

    signal(SIGALRM, func); //2s后要执行的函数
    alarm(2);//设置定时2s

    while (1);

    return 0;
	}

(2)setitimer()函数

在linux下如果对定时要求不太精确的话,使用alarm()和signal()就行了,但是如果想要实现精度较高的定时功能的话,就要使用setitimer函数。

setitimer()为Linux的API,并非C语言的Standard Library,setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个function;

Linux为每个任务安排了3个内部定时器:

ITIMER_REAL:实时定时器,不管进程在何种模式下运行(甚至在进程被挂起时),它总在计数。定时到达,向进程发送SIGALRM信号。

ITIMER_VIRTUAL:这个不是实时定时器,当进程在用户模式(即程序执行时)计算进程执行的时间。定时到达后向该进程发送SIGVTALRM信号。

ITIMER_PROF:进程在用户模式(即程序执行时)和核心模式(即进程调度用时)均计数。定时到达产生SIGPROF信号。ITIMER_PROF记录的时间比ITIMER_VIRTUAL多了进程调度所花的时间。

定时器在初始化是,被赋予一个初始值,随时间递减,递减至0后发出信号,同时恢复初始值。在任务中,我们可以一种或者全部三种定时器,但同一时刻同一类型的定时器只能使用一个。

setitimer函数原型如下:

	#include <sys/time.h>

       int setitimer(int which, const struct itimerval *new_value,
                     struct itimerval *old_value);

	 Timer values are defined by the following structures:

           struct itimerval {
               struct timeval it_interval; /* next value */
               struct timeval it_value;    /* current value */
           };

           struct timeval {
               time_t      tv_sec;         /* seconds */
               suseconds_t tv_usec;        /* microseconds */
           };

it_interval用来指定每隔多长时间执行任务, it_value用来保存当前时间离执行任务还有多长时间。比如说, 你指定it_interval为2秒(微秒为0),开始的时候我们把it_value的时间也设定为2秒(微秒为0),当过了一秒, it_value就减少一个为1, 再过1秒,则it_value又减少1,变为0,这个时候发出信号(告诉用户时间到了,可以执行任务了),并且系统自动把it_value的时间重置为 it_interval的值,即2秒,再重新计数

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

	void test_func()
	{
    static count = 0;

    printf("count is %d\n", count++);
	}

	void init_sigaction()
	{
	    struct sigaction act;
          
    act.sa_handler = test_func; //设置处理信号的函数
    act.sa_flags  = 0;

    sigemptyset(&act.sa_mask);
    sigaction(SIGPROF, &act, NULL);//时间到发送SIGROF信号
	}

	void init_time()
	{
    struct itimerval val;
         
    val.it_value.tv_sec = 1; //1秒后启用定时器
    val.it_value.tv_usec = 0;

    val.it_interval = val.it_value; //定时器间隔为1s

    setitimer(ITIMER_PROF, &val, NULL);
	}

	int main(int argc, char **argv)
	{

	    init_sigaction();
	    init_time();

	    while(1);

	    return 0;
	}

可以看出每个一秒输出一个count的值:

下面是运行结果:

130|stvs9:/ # ./test 
count is 0
count is 1
count is 2
count is 3
count is 4
count is 5
count is 6
count is 7
count is 8
count is 9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常怀安

您的打赏将是我继续创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值