при вызове fork()
будет создан другой процесс. Однако в этом новом процессе он вернет значение «0». Таким образом, процессы после fork будут выполняться одновременно и будут выглядеть следующим образом после расширения оператора if.
новый процесс:
printf("HC: hello from child\n");
printf("Bye\n");
return 0;
}
основной процесс:
int main()
{
printf("HP: hello from parent\n");
wait(NULL);
printf("CT: child has terminated\n");
printf("Bye\n");
return 0;
}
поэтому все операторы дочернего процесса и первый оператор печати основного процесса могут производить результат в любом относительном порядке. Оператор wait
основного процесса не разрешит выполнение оставшихся операторов до завершения дочернего процесса.
Как видите, printf "bye"
существует и в дочернем процессе, поэтому он будет печатается перед оператором ожидания в основном процессе. тогда основной процесс продолжится с этого момента.
Обычно, когда дочерний объект создается, он должен заканчиваться в том же предложении 'if', поэтому, если вы добавите туда оператор 'return' или 'exit', вы увидите лучший результат:
if (fork()== 0) {
printf("HC: hello from child\n");
exit (0);
}
В приведенном выше утверждении дочерний элемент завершит работу после того, как напечатает свое сообщение, и никогда не напечатает «пока».
Что касается exit
, вызов позволяет вам завершить вашу программу от любой процедуры, которую она выполняет. Его аргумент - это статус, который возвращается из программы в операционную систему. В соглашении unix «0» означает успех. Другие значения представляют код ошибки. Но это все зависит от вас.