接上一篇:linux_信号-终端按键信号-硬件异常信号-kill函数-raise函数-abort函数
本次来分享linux的定时器,也就是alarm函数和settimer函数的调用,同时也介绍time的一种用法,开始上菜:
此博主在CSDN发布的文章目录:【我的CSDN目录,作为博主在CSDN上发布的文章类型导读】
目录
- 1.alarm函数
- 1.1.time命令
- 2.setitimer函数
1.alarm函数
函数作用:
设置定时器(闹钟)。在指定seconds后,内核会给当前进程发送14)SIGALRM信号。进程收到该信号,默认动作终止。
头文件:
#include<unistd.h>
函数原型:
unsigned int alarm(unsigned int seconds);
函数参数:
seconds:定时的秒
返回值:
返回0或剩余的秒数,此时剩余的秒数是:距离第一次调用alarm函数后第二次调用alarm函数,上一次设定的seconds定时没有执行完的时间。假设你上一次定时5s,但是你的程序执行2s后又再次调用该函数,则本次调用的返回值就是上一次定时剩余的时间3s。
无失败。
注:
每个进程都有且只有唯一个定时器。
常用:取消定时器alarm(0),返回旧闹钟余下秒数。
定时,与进程状态无关(自然定时法)!就绪、运行、挂起(阻塞、暂停)、终止、僵尸…无论进程处于何种状态,alarm都计时。
例子-多次调用alarm函数:
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int h = alarm(31);//第一次调用
sleep(1);
h = alarm(5);//第二次调用
printf("\n\n%d\n",h); //h = 30s
sleep(2);
h = alarm(52);//第三次调用
printf("\n\n%d\n",h); //h = 3s
sleep(2);
h = alarm(5);//第四次调用
printf("\n\n%d\n",h); //h = 50s
return 0;
}
1.1.time命令
使用time命令查看程序执行的时间。 程序运行的瓶颈在于IO,优化程序,首选优化IO(标准输入输出屏幕)。
例如:
time ./test1 #统计test1程序当前执行的时间
time ./test1 > out #重定向,输出到out文件,这样比打印在屏幕上的效率更高
real:程序执行实际消耗的时间
user:程序运行在用户空间消耗的时间
sys:程序运行在内核空间消耗的时间
实际执行时间 = 系统时间 + 用户时间 + 等待时间
2.setitimer函数
函数作用:
设置定时器(闹钟)。 可代替alarm函数。精度微秒us,可以实现周期定时。
头文件:
#include <sys/time.h>
函数原型:
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
函数参数:
which:指定定时方式
① 自然定时:ITIMER_REAL → 14)SIGLARM 计算自然时间
② 虚拟空间计时(用户空间):ITIMER_VIRTUAL → 26)SIGVTALRM 只计算进程占用cpu的时间
③ 运行时计时(用户+内核):ITIMER_PROF → 27)SIGPROF 计算占用cpu及执行系统调用的时间
new_value:设置定时器的值
old_value:传出参数,可以将距离上一次定时器剩余的时间返回
struct itimerval
{
struct timeval it_interval; /* 周期计时器的间隔 */
struct timeval it_value; /* 下一次到期前的时间*/
};
struct timeval
{
time_t tv_sec; /* 秒 */
suseconds_t tv_usec; /* 微妙*/
};
返回值:
成功:0;
失败:-1,设置errno
例子–程序1s能数多少个数:
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <stdlib.h>
unsigned int myalarm(unsigned int sec)
{
struct itimerval it, oldit;
int ret;
it.it_value.tv_sec = sec;
it.it_value.tv_usec = 0;
it.it_interval.tv_sec = 0;
it.it_interval.tv_usec = 0;
//设置定时
ret = setitimer(ITIMER_REAL, &it, &oldit);
if (ret == -1) {
perror("setitimer");
exit(1);
}
return oldit.it_value.tv_sec;
}
int main(void)
{
int i;
myalarm(1);
//循环1s,程序数数
for(i = 0; ; i++)
{
printf("%d\n", i);
}
return 0;
}
以上就是本次的分享了,希望对大家有所帮助,欢迎大家讨论学习。