2013-05-03 2 views
-1
#include<stdio.h> 
    #include <stdlib.h> 
    int main() 
    { 
      int i=1; 
      pid_t j=fork(); 
      i=4; 
      if(j==0) 
      { 
        printf("%d\n",i); 
      } 
      i=5; // will this line runs in both parent and child? 

    } 

~после fork(), родительский процесс все еще может изменять значение переменной?

Я думаю, что после того, как вилка() в дочернем процессе, я не 1 независимо от того, как родительский процесс изменить его но результат 4 почему не 1?

ответ

2

Вы изменяете значение i у родителя и у ребенка. Весь код после fork() работает в обоих процессах.

pid_t j=fork(); 
i=4;    // <- this runs in both parent and child 
if(j==0) { 
    ...   // <- this runs only in child because of the if 
} 
i=5;    // <- this runs in both parent and child 

Выполнение в ребенке начинается с линии после вилки, а затем работает нормально. Ничего особенного в выполнении ребенка вообще не быть «ребенком» - нормальный поток кода происходит так же, как и в родительском.

Если вы хотите, чтобы четко отделить то, что происходит в детстве и то, что происходит в родительском, сделать его явным в вашем коде:

pid_t j = fork(); 
if (j < 0) { 
    // fork failed, no child created at all 
    // handle error 
} else if (j == 0) { 
    /* In child process */ 
    ... 
} else { 
    /* In parent process */ 
    ... 
} 
+0

как насчет линии 'i = 5' – misteryes

+0

То же самое. Единственное «волшебство» в fork состоит в том, что он создает два процесса, а второй «начинается» сразу после вызова fork. Помимо этого (и тот факт, что 'j' имеет другое значение в родительском и дочернем), код выполняется в обоих процессах, следующих за всеми нормальными правилами. – Mat

+0

, так что если я надеюсь, что дочерний процесс не запускается 'i = 5', я должен использовать' exit() 'внутри блока if (j == 0) {}? – misteryes

1

Код ниже fork работает в обоих parent и child ..

+0

@misteryes Да. Детский процесс является клоном родителя. Таким образом, он выполнит эту строку. – gcbenison

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