SIGCHLD
из предыдущего, вызывающего смерть ребенка kill
поступает как раз в то время, когда вы находитесь в следующем sleep
.
Сон - это прерываемая функция.Если обработчик сигнала работает, когда ваш поток находится в нем, sleep
будет прерван.Итак, вы переходите к следующему kill
, которое косвенным образом вызовет еще один SIGCHLD
, который, скорее всего, произойдет, когда ваша следующая итерация перейдет в спящий режим, что приведет к нескольким пропущенным снам.
Если вы вставите sleep(1)
до fork()
, он должен (практически) сдвигать время точно так, чтобы следующий sleep(20);
не прерывался.
(Я отношусь к этому как к быстрому и грязному эксперименту.хорошая идея полагаться на «корректировки», подобные этой, в производственном коде (или использовать printf
в обработчиках сигналов в этом отношении).