2017-02-01 8 views
4

Я не могу понять, почему он печатает 8 раз текст. В моей концепции он должен печатать всего 2 раза. Может ли кто-нибудь помочь мне?Может ли кто-нибудь объяснить, почему это выполнение вилки печатает 8 раз мой текст?

Код:

#include <stdio.h> 
#include <stdlib.h> 
int main(void) { 
    pid_t x=0; 
    pid_t y=0; 
    x=fork(); 
    if(y>0) 
     fork(); 
    if(x==0) 
     y=fork(); 
    fork(); 
    if(y==0){ 
     fork(); 
     printf("Some text\n"); 
    } 
} 
+1

Только два раза, с этими звонками! Вы пытались добавить некоторые 'printf' для отслеживания потока управления? –

+1

Это выглядит как школьное задание для меня. В чем цель этого вопроса? – manishg

+0

Да, это школьное задание. Я должен определить, сколько раз текст печатается. –

ответ

4

x = fork(); выполняется и 2 процессы запущены.

if (y>0) fork(); никогда не будет выполнен.

if (x==0) y=fork(); будет выполняться дочерним процессом, так что теперь выполняется 3 процесса. Для исходного родителя y по-прежнему 0. Для ребенка это y == child_child's pid, а для ребенка ребенка - y==0.

Все 3 процесса будут исполнять fork(), так что всего 6 процессов, 4 из которых имеют y==0 в их памяти.

Эти 4 процесса вилки снова, так что есть 8 процессы, и они выполняют, что printf(...);

+0

ok elikatsis, я не знал, что каждый процесс имел свою собственную переменную y с 0 значением. Это была путаница. Спасибо. –

+0

Имейте в виду, что каждый разветвленный процесс получает копию родительской памяти, как это прямо перед исполнением вилки! :-) – elikatsis

1

я изменить код, чтобы иметь больше отладки печати.

#include <stdio.h> 
#include <stdlib.h> 
#include "unistd.h" 
int main() { 
    pid_t x=0; 
    pid_t y=0; 

    printf("FORK X \n"); 
    x=fork(); 

    if(y>0) { 
     printf("FORK 1 \n"); 
     fork(); 
    } 

    if(x==0) { 
     printf("FORK 2 \n"); 
     y=fork(); 
    } 

    printf("FORK 3 \n"); 
    fork(); 
    if(y==0){ 
     printf("FORK 4 \n"); 
     fork(); 
     printf("Some text\n"); 
    } 
} 

Вот выход, и каждый "FORK 4" приведет к TWO "Некоторые текст", так как есть вилка впоследствии:

Масленица: TMP greedy52 $ ./a.out

FORK X 
FORK 3 
FORK 4 
FORK 2 
FORK 4 
Some text 
Some text 
FORK 3 
FORK 3 
Some text 
Some text 
FORK 4 
Some text 
FORK 4 
Some text 
Some text 
Some text 

В 4 "раскошелиться 4" достигаются (каждая успешная вилка() вызов создает два процесса а и В):

  1. @ х = вилка() -> х = 0 и @FORK 3 вилки! A
  2. @ x = fork() -> x! = 0 и @FORK 3 fork B
  3. @ x = fork() -> x = 0 и @ y = fork() -> y = 0 и @FORK 3 вилке
  4. @ х = вилка() -> х = 0 и у = @ вилка() -> у = 0 и @FORK 3 вилки Б

Символ @ х = вилка() -> x = 0 и @ y = fork() -> y! = 0 ветвь не генерирует никакого «некоторого текста».

FORK X --------> x != 0 -------------------------------> FORK 3 A -----> FORK 4 A (Some text) 
      |    |           |--> FORK 4 B (Some text) 
      |    | 
      |    |-----------------------------> FORK 3 B -----> FORK 4 A (Some text) 
      |               |--> FORK 4 B (Some text) 
      | 
      | 
      |----> x == 0 -----> FORK 2 A (y = 0) -----> FORK 3 A -----> FORK 4 A (Some text) 
         |           |--> FORK 4 B (Some text) 
         |       |---> FORK 3 B -----> FORK 4 A (Some text) 
         |           |--> FORK 4 B (Some text) 
         | 
         |---> FORK 2 B (y != 0) -----> FORK 3 A -----> XXX bad end 
                |---> FORK 3 B -----> XXX bad end 
+0

wow. Это лучшее объяснение. Огромное спасибо. –