setitimer函数用于设置定时器,并指定定时器到期后所产生的信号行为。其函数原型如下:
#include <sys/time.h>
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
该函数接受三个参数:
-
which:指定定时器类型,可以是以下两个值之一:
- ITIMER_REAL:真实时间定时器,使用系统实时时间,到期后将发送SIGALRM信号。
- ITIMER_VIRTUAL:虚拟时间定时器,使用进程运行时间,到期后将发送SIGVTALRM信号。
- ITIMER_PROF:以两者之和作为时间基准,到期后将发送SIGPROF信号。
-
new_value:一个指向struct itimerval结构体的指针,用于指定新的定时器值(启动时间和间隔时间)。
- it_value字段表示定时器首次到期的时间间隔。
- it_interval字段表示定时器循环触发的时间间隔。
-
old_value:一个指向struct itimerval结构体的指针,用于获取旧的定时器值,即之前设置的定时器值。如果不需要获取旧的定时器值,则可以传入NULL。
调用setitimer函数后,会根据new_value所指定的定时器值来启动或修改定时器。到期后,系统会发送相应的信号,并根据信号处理机制执行相应的操作。可以使用signal函数或sigaction函数来捕获并处理定时器到期产生的信号。
以下是一个示例代码,演示如何使用setitimer函数设置一个定时器:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>
void timer_handler(int signum) {
printf("Timer expired!\n");
}
int main() {
struct itimerval timer;
// 设置首次触发定时器为1秒后,定时器到期后每10秒触发一次
timer.it_interval.tv_sec = 10;
timer.it_interval.tv_usec = 0;
timer.it_value.tv_sec = 1;
timer.it_value.tv_usec = 0;
// 注册信号处理函数
signal(SIGALRM, timer_handler);
// 启动定时器
setitimer(ITIMER_REAL, &timer, NULL);
// 死循环,等待定时器到期
while (1);
return 0;
}
上述代码中,我们设置了一个定时器,其初次到期时间为1秒后,之后每10秒触发一次。当定时器到期时,会触发SIGALRM信号,并通过注册的信号处理函数timer_handler进行处理。在示例代码中,我们只是简单地打印一条信息并没有做其他处理。