2016-03-26 2 views
0
char array[ARRAY_SIZE]; 

void child_process_routine(){ 
int j; 
    for(j = 0;j<ARRAY_SIZE;j++) 
    array[j]='d'; 
} 

main() 
{ 
    pid_t child_pid; 
    int i; 
    for(i = 0;i<ARRAY_SIZE;i++) 
    array[i]='c'; 
    child_pid = fork(); 

     switch (child_pid) { 
     case -1: 
      perror("error");  
      exit(1); 
     case 0: 
      child_process_routine(); 
      exit(0);  
     default: 
      wait(NULL); 
     } 

    print_array(array); 
} 

вы можете объяснить мне, почему родительский процесс не ждет дочернего процесса и это дает мне выход «CCCCCC» снова? он был изменен в дочернем процессе на «dddddd»родительский процесс не ждет для дочернего процесса (с кодом)

что ждать (NULL) даже сделать?

Как он должен знать, что он должен ждать процесса ребенка?

+0

Ребенок получает копию адресного пространства родителя. Изменения в 'array []' делаются только с копией ребенка, копия родителя остается неизменной. В зависимости от вашей операционной системы вы можете получить специальную «общую» память, где изменения видны для обоих процессов. – EOF

ответ

0

Родительский процесс is Ожидание дочернего процесса.

Ребенок не является нитью, это совершенно другой процесс с его собственным уникальным PID и родителем как его родительский PID. Ребенок и родитель не имеют одного и того же массива, у ребенка есть своя копия, поскольку это другой процесс (не поток одного и того же процесса). Поэтому, когда вы устанавливаете массив в «d» в дочернем, это не влияет на массив в родительском процессе.

Попробуйте положить спать (20) в поток дочерних процессов прямо перед его выходом и printf() перед родительским wait(). Вы увидите, что ваше приложение приостанавливается, так как родитель ждет, пока ребенок закончит работу.

+0

Да, я предположил, что глобальная переменная будет разделяться между родителем и дочерними элементами, как и в потоках. Благодарю вас всех за ваши ответы. вопрос строго требует, чтобы родитель печатал обновленный массив, хотя, любые идеи о том, как этого достичь? –

+0

Если родитель должен знать, к чему относится ребенок, вам нужно открыть трубку между ними и поговорить с родителем. –

0

fork() создает другой процесс, но родительский ресурс имеет один и тот же контекст процесса.

, но если вы попытаетесь изменить что-либо в сегменте стека родителя, он делает копию этого и создает отдельный стек для дочернего процесса, но все ресурсы, такие как сегмент данных, сегмент кода и т. Д., Не копируются для дочернего процесса , Они оба разделяют это.

Это копирование на изменение данных после развилки называется «копия на записи»

процесс Родитель ждет дочерний процесс, чтобы закончить. Но его распечатка для родительского и дочернего отдельно и разных данных для обоих

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