面试题答案
一键面试#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
// 信号处理函数
void timer_handler(int signum) {
printf("1秒时间到\n");
}
int main() {
struct itimerval timer;
// 初始化信号处理函数
signal(SIGALRM, timer_handler);
// 设置定时器间隔为1秒
timer.it_value.tv_sec = 1;
timer.it_value.tv_usec = 0;
timer.it_interval.tv_sec = 1;
timer.it_interval.tv_usec = 0;
// 设置定时器
setitimer(ITIMER_REAL, &timer, NULL);
// 主循环,防止程序退出
while (1) {
sleep(1);
}
return 0;
}
setitimer函数使用要点
- 函数原型:
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
- 参数说明:
which
:指定定时器类型,常见的有ITIMER_REAL
(实时定时器,计时以系统真实时间为准,超时发送SIGALRM
信号)、ITIMER_VIRTUAL
(以进程运行时间为准,超时发送SIGVTALRM
信号)、ITIMER_PROF
(以进程运行时间 + 内核调度进程的时间为准,超时发送SIGPROF
信号)。在本程序中使用ITIMER_REAL
。new_value
:指向struct itimerval
结构体的指针,用于设置定时器的初始值和间隔值。struct itimerval
结构体定义如下:
struct itimerval { struct timeval it_interval; /* 定时器周期 */ struct timeval it_value; /* 定时器初始值 */ }; struct timeval { time_t tv_sec; /* 秒 */ suseconds_t tv_usec; /* 微秒 */ };
old_value
:若不为NULL
,则保存上一次定时器的设置值。
- 返回值:成功返回0,失败返回 -1,并设置
errno
。
本程序使用setitimer
函数,设置一个ITIMER_REAL
类型的定时器,每隔1秒触发一次SIGALRM
信号,在信号处理函数中输出提示信息。