由“ setitimer()”启动的计时器会重启吗?

时间:2019-03-23 08:29:24

标签: linux linux-kernel kernel

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时分配了一个间隔值,这意味着我们想在每个间隔触发计时器,那么应​​该在哪里重新启动“真实计时器”?

1 个答案:

答案 0 :(得分:1)

您说的it_real_fn函数不会重新启动实时计时器是正确的,但是使用setitimer时,不是在计时器到期时调用的函数。

setitimer函数是POSIX计时器的一部分,其Linux实现在posix-timers.c中,在此文件中,函数posix_timer_fn可能同时返回HRTIMER_RESTARTHRTIMER_NORESTART被定义并分配给it_real_fn的{​​{1}}(将函数设置为计时器回调的代码在common_timer_set中,由POSIX计时器初始化调用)。