Вот что происходит у родителя:
- Вилка ребенка.
- Отправьте SIGUSR1 ребенку.
- Дождитесь сигнала.
Вот что происходит с ребенком:
- Ждать сигнала.
- Печать
Child
.
- Позвоните
kill(0, SIGUSR1)
(0 - значение pid
для ребенка). Вызов kill
с идентификатором процесса 0 отправляет сигнал каждому процессу в группе процессов процесса, который вызывает kill
.
- Дождитесь сигнала.
Существует несколько возможных вариантов поведения вашей программы в зависимости от порядка выполнения родительского и дочернего системных вызовов. В зависимости от конкретной версии вашей операционной системы, от точной настройки различных параметров ядра, от того, насколько загружена ваша система, и от случайного выбора, вы можете или не можете наблюдать различное поведение, если вы запускаете программу несколько раз или под отладчик.
Если родитель начинает быстрее, чем ребенок, вы можете увидеть это:
- Родитель отправляет SIGUSR1 ребенку.
- Ребенок получает SIGUSR1 и печатает
Catched
.
- ребенок звонит
pause
.
- Родительские звонки
pause
.
При таком порядке выполнения родитель и потомок в конечном итоге ждут вечно (это тупик ).
Если ребенок начинает быстрее, чем родитель, вы можете увидеть это:
- Ребенок звонит
pause
.
- Родитель отправляет SIGUSR1 ребенку.
- Родительские звонки
pause
.
- Ребенок разблокирован и печатает
Catched
.
- Отпечатки детей
Child
.
- Child отправляет SIGUSR1 в группу процессов.
- Детские принты
Catched
.
- ребенок звонит
pause
.
- Родитель разблокирован и печатает
Catched
.
- родительский выход.
Я не думаю, что у ребенка есть способ выйти: он дважды вызывает pause
, и хотя он может получить до двух сигналов, один из них отправляется от самого себя (тот, что из kill(0,SIGUSR1)
) и тот доставляется синхронно, а не во время выполнения pause
.
Эта программа, вероятно, не та, что вы хотели написать, но, поскольку вы не описываете ожидаемое поведение, невозможно сказать, что вы хотели написать. Замечу, что вы не следуете обычной структуре программы, которая разветвляется:
pid = fork();
if (pid < 0) {
/*error handling*/
} else if (pid == 0) {
/*child code*/
exit(...); /*Usually, what follows the if is specific to the parent.*/
}