Linux内核中的每个task_struct
都有一个名为“实时计时器”的字段,它是一个struct hrtimer
(高分辨率计时器)。当我们使用setitimer
设置计时器时,它会将进程中的“实际计时器”设置为以给定值过期。到期时,将调用名为it_real_fn
的函数。这是source code in Linux kernel 2.6.39.4:
/*
* The timer is automagically restarted, when interval != 0
*/
enum hrtimer_restart it_real_fn(struct hrtimer *timer)
{
struct signal_struct *sig =
container_of(timer, struct signal_struct, real_timer);
trace_itimer_expire(ITIMER_REAL, sig->leader_pid, 0);
kill_pid_info(SIGALRM, SEND_SIG_PRIV, sig->leader_pid);
return HRTIMER_NORESTART;
}
我发现它返回HRTIMER_NORESTART
,这意味着它不应重新启动。但是,如果我们在调用setitimer
时分配了一个间隔值,这意味着我们想在每个间隔触发计时器,那么应该在哪里重新启动“真实计时器”?
答案 0 :(得分:1)
您说的it_real_fn
函数不会重新启动实时计时器是正确的,但是使用setitimer
时,不是在计时器到期时调用的函数。
setitimer
函数是POSIX计时器的一部分,其Linux实现在posix-timers.c
中,在此文件中,函数posix_timer_fn
可能同时返回HRTIMER_RESTART
和HRTIMER_NORESTART
被定义并分配给it_real_fn
的{{1}}(将函数设置为计时器回调的代码在common_timer_set
中,由POSIX计时器初始化调用)。