что происходит с указателями на динамически выделяемую память после разветвления UNIX? - PullRequest
9 голосов
/ 29 сентября 2011

Кто-то, пожалуйста, уточните, что происходит с указателями после разветвления ().

Насколько я понимаю, указатели на что-либо в стеке или статически размещенные относятся к регистрам стека / сегмента данных, поэтому копирование их точно во время разветвления - это нормально.

Тем не менее, что произойдет, если я что-то произвёл malloc () перед разветвлением? например:

void* p = malloc(64);
// put something in *p;
fork();

// what happens to p and the memory i allocated here?

возможностей, о которых я думаю:

  1. * p копируется в какую-то другую часть кучи, p обновляется, чтобы отразить вновь скопированное местоположение.

  2. p по-прежнему указывает на оригинал. если любой ребенок бежит на свободу (р); родитель может быть не в состоянии получить к нему доступ.

  3. p по-прежнему указывает на исходные данные, но дочерний процесс не имеет прав на доступ к памяти или управление ею.

Какой из них, если таковой имеется, является правильным?

Ответы [ 3 ]

13 голосов
/ 29 сентября 2011

При разветвлении дочерний процесс становится копией своего родителя. Это включает в себя любую динамически распределенную память. Так что память будет скопирована. Адрес указателя останется прежним (копия не изменяет данные, помните?), Что достигается с помощью виртуальной адресации . Не забудьте вызвать free в родительских и дочерних процессах.

3 голосов
/ 29 сентября 2011

Значение также копируется, так как вилка копирует код, глобальные переменные, кучу и стек.

Источник: http://web.eecs.utk.edu/~huangj/cs360/360/notes/Fork/lecture.html

1 голос
/ 29 сентября 2011

Malloced memory происходит из heap , который является просто причудливым словом для набора страниц памяти . Поскольку fork() копирует все страницы памяти процесса, независимо от того, какие причудливые имена они были даны в учебниках, указатели, возвращаемые fork (), прекрасно работают в дочернем процессе: -)

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