Один и тот же адрес памяти для разных процессов - PullRequest
0 голосов
/ 03 июля 2018

Я просто не могу понять, почему этот код работает так, как работает (а не ожидал):

 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <sys/wait.h>
 #include <sys/types.h>

 int main()
 {
     int buffer;
     int* address;

     address=&buffer;


     if(fork()==0)
     {
         *address=27;
         printf("Address %ld stores %d\n",(long)address,*address);
         exit(0);
     }
     wait(NULL);

     printf("Address %ld stores %d\n",(long)(&buffer),buffer);    
     return 0;
 }

Почему система хранит разные переменные, даже если они указывают на один и тот же адрес памяти?

ПРИМЕЧАНИЕ: я никогда не ожидал, что этот код будет работать, так как в противном случае целая куча каналов и прочего не имела бы никакого смысла; Я просто хотел бы понять, что здесь происходит.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

С wikipedia : Операция fork создает отдельное адресное пространство для дочернего элемента. Дочерний процесс имеет точную копию всех сегментов памяти родительского процесса.

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

0 голосов
/ 03 июля 2018

Это на самом деле не вопрос С, он касается поведения (современных) операционных систем.

Вкратце: программа пользовательского пространства в современной ОС работает в частном виртуальном адресном пространстве. При доступе к памяти виртуальный адрес преобразуется в физический адрес. Отображение между фактической памятью и виртуальным адресным пространством устанавливается операционной системой - память разделяется на страницы, и страницу можно «отображать» в адресное пространство процесса.

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

Я уверен, что вы легко найдете более подробную информацию в поиске ключевых слов, приведенных в этом ответе.

...