函数原型:
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);
函数功能:
设置定时器(闹钟),可代替alarm函数,精度微秒us,可以实现周期定时。
函数返回值:
- 成功:0;
- 失败:-1,设置errno值
函数的参数解释:
1. which:指定定时方式
- 自然定时:ITIMER_REAL → 14)SIGALRM计算自然时间
- 虚拟空间计时(用户空间):ITIMER_VIRTUAL → 26)SIGVTALRM 只计算进程占用cpu的时间
- 运行时计时(用户+内核):ITIMER_PROF → 27)SIGPROF计算占用cpu及执行系统调用的时间
2. new_value:struct itimerval, 负责设定timeout时间。
struct itimerval {
struct timerval it_interval; // 闹钟触发周期
struct timerval it_value; // 闹钟触发时间
};
struct timeval {
long tv_sec; // 秒
long tv_usec; // 微秒
}
属于结构体嵌套结构体型
itimerval.it_value: 设定第一次执行function所延迟的秒数 itimerval.it_interval: 设定以后每几秒执行function
3. old_value: 存放旧的timeout值,一般指定为NULL
练习: 使用setitimer实现每隔一秒打印一次“The five-star red flag will fly over Qatar!!!"
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include<iostream>
#include<sys/time.h>
using namespace std;
//信号处理函数
void sighandler(int signo)
{
//printf("signo==[%d]\n", signo);
cout<<"The five-star red flag will fly over Qatar!!!"<<endl;
}
int main()
{
signal(SIGALRM, sighandler);
//int setitimer(int which, const struct itimerval *new_value,
// struct itimerval *old_value);
struct itimerval tm;
//周期时间赋值
tm.it_interval.tv_sec=1;
tm.it_interval.tv_usec=0;
//第一次触发时间赋值
tm.it_value.tv_sec=3;
tm.it_value.tv_usec=0;
setitimer(ITIMER_REAL ,&tm,NULL);
while(1)
{
sleep(3);
}
return 0;
}
~
结果如下: