Законен ли доступ к разделу кучи родительского процесса дочерним процессом (созданным fork ())? - PullRequest
4 голосов
/ 24 октября 2011

Может ли дочерний процесс получить доступ (чтение и запись) к адресному пространству кучи родительского процесса?Ниже приведена программа, которую я попробовал на http://www.ideone.com/R5vDT, которая успешно работает:

int main(){
        int *p = (int*)malloc(sizeof(int));
        if(fork()){
        //parent process
                *p = 25;//Write
                printf("Parent %d: %d %p\n", getpid(), *p, p);//Read
        }else{
        //child process
                *p = 15;//write
                printf("Child %d: %d %p\n", getpid(), *p, p);//read
        }
        return 0;
}     

Вывод:

Parent 30597: 25 0x9781008
Child 30600: 15 0x9781008

Я читал о COW (копирование при записи), ноадреса, указанные p, одинаковы даже после операции записи.Разве операционная система не должна вызывать исключение, потому что один процесс обращается к памяти за пределами своего адресного пространства?

1 Ответ

7 голосов
/ 24 октября 2011

Ну, два процесса имеют свои собственные адресные пространства, которые для каждого процесса выглядят одинаково, даже если они не обращаются к одной и той же памяти.Однако во многих операционных системах реализовано то, что называется копированием при записи, что означает, что память копируется не во время вызова fork, а в том случае, когда один из процессов модифицирует память.Пока никакой процесс не записывает в память, они читают из одной и той же памяти.Когда один из них пытается изменить память, возникает некоторый тип исключений, и память копируется, так что они оба имеют частную область памяти, недоступную для любого другого процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...