Модификация переменных в дочернем процессе

Я работаю над Computer Systems, A Programmer's Perspective Брайанта и О'Халларона. В упражнении 8.16 запрашивается вывод программы наподобие (я изменил его, потому что они используют заголовочный файл, который вы можете скачать на их веб-сайте):

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int counter = 1;

int main()
{
    if (fork() == 0){
        counter--;
        exit(0);
    }

    else{
        Wait(NULL);
        printf("counter = %d\n", ++counter);
    }
    exit(0);
}

Я ответил «счетчик = 1», потому что родительский процесс ждет завершения своих дочерних процессов, а затем увеличивает счетчик. Но ребенок сначала уменьшает его. Однако, когда я тестировал программу, я обнаружил, что правильный ответ был «счетчик = 2». Отличается ли переменная counter в дочернем и родительском процессах? Если нет, то почему ответ 2?


person teaLeef    schedule 20.08.2014    source источник
comment
Память родительского процесса копируется для создания дочернего процесса, поэтому нет, два процесса не разделяют counter.   -  person event44    schedule 21.08.2014
comment
Отличается ли переменная counter в дочернем элементе? - да.   -  person Oliver Charlesworth    schedule 21.08.2014


Ответы (1)


Ваш родительский процесс начинается с counter в 1.

Затем он ожидает завершения разветвленного дочернего процесса.

(Что бы ни происходило в разветвленном процессе, это не влияет на родительскую версию counter. У каждого процесса есть собственное пространство памяти; никакие переменные не используются совместно.)

И, наконец, оператор printf() сначала увеличивает counter с помощью оператора ++, благодаря чему counter получает значение 2.

person meaning-matters    schedule 20.08.2014