2017-02-17 17 views
1

Я изучаю экзамен по операционной системе, и теперь я вижу код для поведения системного вызова fork(). Основная цель - рисовать дерево процессов, созданных этим кодом. Я сделал это, но я не могу объяснить, потому что, когда я запускаю этот код, он печатает 6-кратные значения glob, два из которых разные, а все остальные равно. Почему это? Он не должен печатать одно значение glob (точно значение 2 переменной glob)? Спасибо всем!Некоторое объяснение поведения системного вызова fork?

это код:

int main(int argc,char* argv[]){ 

int glob=5; 
int pid=0; 

pid=fork(); 
glob--; 
pid=fork(); 
glob--; 

if (pid!=0) { 
    pid=fork(); 
    glob--; } 

printf("Value=%d\n",glob); 

return 0; 
} 
+0

Вы пробовали отслеживать выполнение с помощью карандаша на бумаге и отслеживать значения таким образом? – Dai

+1

Является ли '' glob' 'просто именем мета переменной, например 'foo'? Это не очень хорошо выбрано, так как это тень [стандартная функция POSIX] (https://linux.die.net/man/3/glob), которая может сбивать с толку. Это не проблема, которую вы видите, но это сбивает с толку. – unwind

ответ

2

Вы можете начать с процесса 1.

Первый вызов fork создает новый процесс - 2.

Теперь, 1 и 2 продолжает работать. И снова звоните fork, теперь вы создали процесс 3 и 4.

Теперь вы проверяете, является ли возвращенный pid равным 0. Если это не так (который не будет обрабатываться 1 и 2), вы вызываете fork снова в процессе 1 и 2 и создать процесс 5 и 6.

Процессы 1, 2, 3, 4, 5 и 6 теперь вызывают printf.

+0

На моем листе, так что я создал график. Старт с процессом A, у которого есть GLOB = 5.A fork в B и для B теперь GLOB = 5. После «glob--» для A и B теперь glob - 4. Теперь A и B теперь вилки в C и D соответственно, а для C и D glob - 4. После «glob--» GLOB равен 3 для всех процессов. Теперь начинается конструкция IF. Это касается только отцов процесса, следовательно, процессов A и B . В этом выражении A и B создаются соответственно процесс E и F, а затем уменьшается переменная GLOB до 2. Теперь, когда весь процесс печатает значение Glob. Для A и B значение равно 2, а для другого - 3. Правильно? – Joe

+0

@ user5508485 glob is 2 для процессов A B E F и для C D 3 –

+0

Зачем это? Системный вызов fork в выражении If вызывается до «glob--», поэтому процессы E и F должны быть GLOB = 3. – Joe

0

Поскольку вы создаете три повторяющихся процесса, то одновременно выполняются операции с оригиналом и дублированием процессов, некоторые операции занимают больше времени, чем другие.

0

После первого звонка в fork() у вас есть два процесса с переменной glob с декрементом до 4.

После второго звонка на fork() у вас есть четыре процесса с переменной glob с декрементом до 3.

Но тогда, только те, что были родителями во втором вызове (они получили != 0 от второго вызова fork(), эти два процесса в целом) сделать третий вызов fork() (становится четыре процесса) и уменьшают переменный glob снова 2 --- это, родители и дети, в общей сложности четырех процессов в общей сложности шесть)

так только четыре процесса от всего шесть, сделать третий декремент glob и так, вы ожидаете четыре значения 2 и еще два с 3.