Какое направление примет эту программу? Мне тяжело после x.
Для того, чтобы проиллюстрировать, что происходит здесь, мы можем добавить еще один вызов printf()
, где дочерний процесс выполняет:
int pid;
signal(SIGCHLD, handler);
if ((pid = fork()) == 0) {
x -= 3;
printf("x = %d\n", x);
exit(0);
}
Что Происходило внутри этой программы, шаг за шагом:
You настройте обработчик сигнала для выполнения, когда завершится дочерний процесс: signal(SIGCHLD, handler)
.
Написав if ((pid = fork()) == 0)
, вы выполняете раздел под, если в качестве кода для ребенка (как вы сравниваете результат fork с 0
). Более того, forked process наследует значение 10
, которое к моменту выполнения кода дочернего процесса равно 10
. Затем мы вычитаем 3
из 10
:
int pid;
signal(SIGCHLD, handler);
if ((pid = fork()) == 0) {
x -= 3;
printf("x = %d\n", x);
exit(0);
}
Но это происходит только в дочернем процессе, поэтому при выполнении последней части кода:
waitpid(pid, NULL, 0);
printf("x = %d\n", x);
то обработчик выполняется (в родительском процессе), поэтому добавление 7
к 10
(значение x в родительском процессе). Вот почему в конце вы получаете 17
.
Возможно, вы могли бы скомпилировать и выполнить его? – user2182349
Возможно, вы можете уточнить, какую часть программы вы не понимаете. Например, вы понимаете 'fork'? Вы понимаете «сигнал»? и т. д. Какие части вы не понимаете. – kaylum