Вопрос в том, что выдает функция foo?
Вы, похоже, спрашиваете, что является возвращаемым значением из foo()
. «Вывод» обычно относится к данным, записанным в терминал или во внешний файл. Но остается вопрос: в каком процессе? Предположим, что fork()
успешен, тогда у вас есть два практически идентичных процесса, каждый из которых выполняет foo()
.
1)If execvp succeeds, it does not return any value.
Если execvp()
завершается успешно, он вообще не возвращает .
Если это не удается, он возвращает -1 (я думаю, что это возвращаемое значение не должно ничего делать
с моей функцией foo).
Да. Однако только ваш дочерний процесс выполняет execvp()
, и в случае возврата он завершает вызов exit()
.
2)exit(1) kills the child process and returns the control flow to the parent.
Это завершает процесс, прежде чем он когда-либо вернется из foo()
, поэтому в дочернем процессе foo()
никогда не возвращается, независимо от того, успешно ли execvp
или нет. Элемент управления не возвращает родителю. Формирование процесса совсем не то же самое, что вызов функции. Родитель может узнать код выхода ребенка с помощью вызова waitpid()
.
В родительском , если fork()
завершается ошибкой, этот процесс также вызывает exit()
и, следовательно, не возвращается из foo()
. Предположим, что fork()
завершается успешно, с другой стороны, родитель ожидает, пока дочерний процесс завершится. Дочерний процесс - это отдельный процесс, со своей собственной копией всех переменных, поэтому все, что он мог сделать со своей копией fail
, не влияет на родителя. То есть разветвление дочернего процесса не похоже на запуск потока в том же процессе.
Поскольку родительский элемент сам не изменяет fail
, он по-прежнему имеет свое начальное значение 10, если он достигает
if (fail == 1){
10! = 1, поэтому, если foo()
вернется, то вернется 0.