Linux下的定时器

 2023-09-16 阅读 18 评论 0

摘要:1.alarm()运行后,进程将继续运行。在后期(alarm以后)的运行过程中将会在seconds秒后收到信号SIGALRM并运行其处理函数。 #include <stdio.h> #include <unistd.h> #include <signal.h> void sigalrm_fn(int sig) {printf("alarm!\n");alarm

1.alarm()运行后,进程将继续运行。在后期(alarm以后)的运行过程中将会在seconds秒后收到信号SIGALRM并运行其处理函数。

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void sigalrm_fn(int sig)
{printf("alarm!\n");alarm(2);return;
}
int main(void)
{signal(SIGALRM, sigalrm_fn);alarm(1);while(1) pause();
}

2.alarm定时器,可是仅仅能精确到秒,然而我们假设须要用到更精准的定时器能够用setitimer
 int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
 setitimer()比alarm功能强大,支持3种类型的定时器:
    ITIMER_REAL :     以系统真实的时间来计算。它送出SIGALRM信号。
    ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算。它送出SIGVTALRM信号。
    ITIMER_PROF :     以该进程在用户态下和内核态下所费的时间来计算。它送出SIGPROF信号。
    setitimer()第一个參数which指定定时器类型(上面三种之中的一个)。第二个參数是结构itimerval的一个实例;第三个參数可不做处理。


    setitimer()调用成功返回0。否则返回-1。

    以下是关于setitimer调用的一个简单示范,在该样例中,每隔一秒发出一个SIGALRM。每隔0.5秒发出一个SIGVTALRM信号:[code=C/C++]

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
int sec;
void sigroutine(int signo){switch (signo){case SIGALRM:printf("Catch a signal -- SIGALRM \n");signal(SIGALRM, sigroutine);break;case SIGVTALRM:printf("Catch a signal -- SIGVTALRM \n");signal(SIGVTALRM, sigroutine);break;}return;
}
int main()
{struct itimerval value, ovalue, value2;          sec = 5;printf("process id is %d\n", getpid());signal(SIGALRM, sigroutine);signal(SIGVTALRM, sigroutine);value.it_value.tv_sec = 1;value.it_value.tv_usec = 0;value.it_interval.tv_sec = 1;value.it_interval.tv_usec = 0;setitimer(ITIMER_REAL, &value, &ovalue); value2.it_value.tv_sec = 0;value2.it_value.tv_usec = 500000;value2.it_interval.tv_sec = 0;value2.it_interval.tv_usec = 500000;setitimer(ITIMER_VIRTUAL, &value2, &ovalue);for(;;);
}
setitimer不会引起线程的堵塞、也不会引起线程的切换动作,就是简单的启动一个定时器,開始定时。并且这样的定时应该是基于内核的。(windwos的settimer是基于一种消息的模型)。setitimer尽管有三种类型ITIMER_REAL,ITIMER_VIRTUAL ITIMER_PROF,可是在同一时间同一进程。一种类型的仅仅能有1个setitimer。


版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/69433.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息