2014-09-07 4 views
3

Что произойдет, если я называю:ветвление внутри если дилемма

if (fork() == fork()) 
    //do something 

ли оба родителя и оба дети входят заявление или что процедура в этом случае?

+0

Я подозреваю, что в заявлении войдет только внук. Вы пробовали эксперимент? – Beta

+0

Я этого не сделал, потому что я действительно не знаю, как его протестировать и как завершить полезную информацию из теста – 2014-09-07 23:00:41

+1

Не поклонник 'printf', а? –

ответ

6

С двумя вилами вы получите четыре процесса: один родитель, двое детей и один внук.

Порядок, в котором происходят две вилки, не определен, так как C не требует выражения для оценки слева направо. В конце концов, неважно, что произойдет первым, так что давайте притвориться, что первое fork() произошло первым. Когда это произойдет, у вас будет один родитель и один ребенок. Родитель получит PID ребенка назад, а ребенок получит 0.

Назовем родителя A и ребенка B. Вот то, что эти два процесса будет выглядеть после того, как левая вилка выполняет:

A   if (<pidof B> == fork()) 
| 
+--B  if (0 == fork()) 

Теперь каждый из них будет выполнять правильную вилку. Два процесса становятся четырьмя. Назовем нового ребенка BC и 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.

1

Попробуйте этот эксперимент:

#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» и один печатает «два равны». Все это ясно?

+0

да, спасибо :) – 2014-09-07 23:13:09

Смежные вопросы