Каждый 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
, что означает, что мы хотим запускать таймер на каждом интервале, где должен быть перезапущен «реальный таймер»?