Что произойдет, если я называю:ветвление внутри если дилемма
if (fork() == fork())
//do something
ли оба родителя и оба дети входят заявление или что процедура в этом случае?
Что произойдет, если я называю:ветвление внутри если дилемма
if (fork() == fork())
//do something
ли оба родителя и оба дети входят заявление или что процедура в этом случае?
С двумя вилами вы получите четыре процесса: один родитель, двое детей и один внук.
Порядок, в котором происходят две вилки, не определен, так как C не требует выражения для оценки слева направо. В конце концов, неважно, что произойдет первым, так что давайте притвориться, что первое fork()
произошло первым. Когда это произойдет, у вас будет один родитель и один ребенок. Родитель получит PID ребенка назад, а ребенок получит 0
.
Назовем родителя A
и ребенка B
. Вот то, что эти два процесса будет выглядеть после того, как левая вилка выполняет:
A if (<pidof B> == fork())
|
+--B if (0 == fork())
Теперь каждый из них будет выполнять правильную вилку. Два процесса становятся четырьмя. Назовем нового ребенка B
C
и A
новым ребенком D
. Опять же, каждый вызов fork()
возвращает одно из двух значений: идентификатор нового ребенка в родительском процессе или 0 в дочернем процессе. Вот что наши четыре процессы становятся:
A if (<pidof B> == <pidof D>)
|
+--B if (0 == <pidof C>)
| |
| +--C if (0 == 0)
|
+--D if (<pidof B> == 0)
Как это происходит, процесс C
будет только один, который проходит проверку if
.
Попробуйте этот эксперимент:
#include<stdio.h>
#include <unistd.h>
int main(void)
{
printf("beginning\n");
if(fork() == fork())
{
printf("two are equal\n");
}
printf("done\n");
return 0;
}
один процесс печатает «начало», четыре печати «Done» и один печатает «два равны». Все это ясно?
да, спасибо :) – 2014-09-07 23:13:09
Я подозреваю, что в заявлении войдет только внук. Вы пробовали эксперимент? – Beta
Я этого не сделал, потому что я действительно не знаю, как его протестировать и как завершить полезную информацию из теста – 2014-09-07 23:00:41
Не поклонник 'printf', а? –