таймер, запущенный функцией setitimer (), будет перезапущен? - PullRequest
1 голос
/ 23 марта 2019

Каждый task_struct в ядре Linux имеет поле с именем «real timer», которое представляет собой struct hrtimer (таймер высокого разрешения).Когда мы устанавливаем таймер с помощью setitimer, он устанавливает «реальный таймер» в процессе, срок которого истекает с помощью данного значения.По истечении этого срока вызывается функция с именем it_real_fn.Вот исходный код в ядре Linux 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 Ответ

1 голос
/ 23 марта 2019

Вы правы, говоря, что функция it_real_fn не будет перезапускать таймер реального времени, но это не та функция, которая вызывается по истечении таймера при использовании setitimer.

Функция setitimer является частью таймеров POSIX, и их реализация в Linux находится в posix-timers.c. В этом файле функция posix_timer_fn, которая может возвращать оба HRTIMER_RESTART и HRTIMER_NORESTART определены и присвоены it_real_fn из struct hrtimer (код, который устанавливает эту функцию в качестве обратного вызова таймера, находится в common_timer_set, который вызывается POSIX инициализация таймера).

...