1
| int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);
|
设置定时器(闹钟),可代替alarm函数,精度微秒us,可以实现周期定时。
-
函数返回值
-
函数参数:
-
which:指定定时方式
-
自然定时:ITIMER_REAL → 14)SIGALRM计算自然时间
-
虚拟空间计时(用户空间):ITIMER_VIRTUAL→ 26)SIGVTALRM 只计算进程占用cpu的时间
-
运行时计时(用户+内核):ITIMER_PROF → 27)SIGPROF计算占用cpu及执行系统调用的时间
-
new_value:struct itimerval, 负责设定timeout时间。
itimerval.it_value: 设定第一次执行function所延迟的秒数
itimerval.it_interval: 设定以后每几秒执行function
-
old_value: 存放旧的timeout值,一般指定为NULL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| struct itimerval {
struct timerval it_interval; // 闹钟触发周期
struct timerval it_value; // 闹钟触发时间
};
struct timeval {
long tv_sec; // 秒
long tv_usec; // 微秒
}
|
练习: 使用setitimer实现每隔一秒打印一次hello, world。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<sys/time.h> #include<signal.h>
void sighandler(int signo) { printf("hello world\n"); printf("signo [%d]\n",signo); }
int main(int argc,char * argv[]) { signal(SIGALRM,sighandler); 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(1); }
return 0; }
|