linux内核中的每个定时器都有一个名为"real 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时分配一个间隔值,这意味着我们希望在每个时间间隔触发计时器,那么“真正的计时器”应该在哪里重新启动呢?
发布于 2019-03-23 17:41:45
您说得对,it_real_fn函数不会重新启动实时计时器,但它不是使用setitimer时在计时器到期时调用的函数。
setitimer函数是POSIX计时器的一部分,它们的Linux实现在posix-timers.c中,在这个文件中,可以同时返回HRTIMER_RESTART和HRTIMER_NORESTART的函数posix_timer_fn被定义并分配给struct hrtimer的it_real_fn (将该函数设置为计时器回调的代码在common_timer_set中,由POSIX计时器初始化调用)。
https://stackoverflow.com/questions/55311981
复制相似问题