Чем заканчивается родительский процесс в этом коде? Я вижу, что он никуда не уходит... Мой друг говорит, что родитель не завершен/не убит, код просто останавливается на последнем выходе (0). Если это так, то что пробуждает родительский процесс от сна? заранее спасибо
adghtesd
результаты программы:
parent: I'm the parent
child: I'm the child
child: I'm exiting
parent: child process (PID=1919) exited with value 123
parent: exiting
test
@Someprogrammerdude, но код останавливается сразу после того, как ребенок закончил свою работу. Обратите внимание, что дочерний процесс спит 3 секунды, а родительский — 10, но сразу после завершения дочернего процесса родитель прекращает сон, и код заканчивается на exit(0).
@MrMoil Кстати, нельзя вызывать exit
из обработчиков сигналов (и printf
тоже).
Из эта ссылка POSIX на sleep
:
If
sleep()
returns because the requested time has elapsed, the value returned shall be 0. Ifsleep()
returns due to delivery of a signal, the return value shall be the "unslept" amount (the requested time minus the time actually slept) in seconds.
Что происходит для вас, так это то, что когда родительский процесс получает сигнал SIGCHLD
, он вызывает прерывание функции sleep
, и родительский процесс продолжает работу после вызова sleep
.
Если вы хотите спать всю сумму, вам нужно проверить, что возвращает sleep
, и вызывать sleep
в цикле, пока он не вернет 0
.
Также было бы проще реализовать это с помощью nanosleep
, clock_nanosleep
или C11 thrd_sleep
, поскольку они обеспечивают оставшееся время.
Родительский процесс запускает функцию
il_parent
. Затем функцияil_parent
возвращается и возвращается к функцииmain
и ееswitch
.switch
заканчивается, и вызывается функцияexit(0)
в конце. Это можно легко проверить, если вы попытаетесь отладить свою программу либо с помощью отладка резиновой утки, либо путем пошагового выполнения кода в реальном отладчике.