Внутри дочерних и родительских процессов переменные имеют одинаковые адреса, но имеют разные значения? - PullRequest
0 голосов
/ 21 сентября 2018
#include <stdio.h>
#include <unistd.h>

int main() {
    int x = 0;
    pid_t pid = fork();
    if(pid == 0) {
        //adding one to X when it is child process
        x++;
    }
    printf("current X: %d, address of X: %p, process : %d\n", x, &x, pid);
}

результат: результат

Так что я новичок в Unix и не очень знаком с fork ().Если дочерний процесс создаст копию родительского процесса, чтобы он имел разные адресные пространства.Тогда почему X в обоих процессах имеет одинаковый адрес, но разное значение?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Из вики на Fork:

Операция fork создает отдельное адресное пространство для дочернего элемента. Дочерний процесс имеет точную копию всех сегментов памяти родительского процесса. В современных вариантах UNIX, которые следуют модели виртуальной памяти из SunOS-4.0, реализована семантика копирования при записи и физическая памятьне нужно на самом деле копировать. Вместо этого страницы виртуальной памяти в обоих процессах могут ссылаться на одни и те же страницы физической памяти, пока одна из них не запишет на такую ​​страницу: затем она будет скопирована. Эта оптимизация важна в общем случае, когда используется forkв сочетании с exec для выполнения новой программы: обычно дочерний процесс выполняет только небольшой набор действий, прежде чем он прекращает выполнение своей программы в пользу запускаемой программы, и ему требуется очень мало, если таковые имеются, его родительского процессаструктуры данных.

0 голосов
/ 21 сентября 2018

Так работает форк.Создает копию адресного пространства, фактически выполняет некоторые оптимизации (необходимо писать только измененные страницы).

В копии используются те же адреса:

  • это возможно , поскольку каждый родительский и дочерний процессы будут видеть только свою версию

  • и требуется : если у вас есть какая-либо связанная структура данных, указатели от одного объекта к другому должны оставаться действительными.Если скопированное адресное пространство будет занимать разные адреса, тогда все указатели должны быть исправлены - и операционная система даже не знает, какие из байтов являются указателями, а какие - просто данными.

...