Что происходит с памятью malloc после того, как exec () изменит образ программы? - PullRequest
28 голосов
/ 25 марта 2011

Я знаю, что когда я вызываю один из системных вызовов exec() в Linux, он заменит текущий запущенный процесс новым образом.Поэтому, когда я запускаю новый процесс и запускаю exec(), дочерний процесс будет заменен новым процессом.

Что происходит с любой памятью, которую я выделил из кучи?Скажем, я хочу проанализировать произвольное количество команд и отправить его в exec().Чтобы удержать это произвольное число, мне, вероятно, придется в какой-то момент выделить память, поскольку я не думаю, что смогу сделать это правильно с массивами статического размера, поэтому я, скорее всего, буду использовать malloc() или что-то эквивалентное.

Мне нужно хранить эту память до тех пор, пока я не позвоню exec(), но exec() никогда не вернется.

Память восстанавливается операционной системой?

Ответы [ 2 ]

25 голосов
/ 25 марта 2011

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

Когда вы вызываете exec() в дочернем процессе, дочерний процесс заменяется новым процессом.Из execve (2):

execve() does not return on success, and the text, data, bss, and stack
of the calling process are overwritten by that of the program loaded.

Перезаписывая сегмент data, вызов exec() эффективно освобождает память, выделенную ранее malloc().

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

РЕДАКТИРОВАТЬ: Современные реализации malloc() используют анонимные отображения памяти, см. Mmap (2),Согласно execve (2), отображения памяти не сохраняются при вызове exec(), поэтому эта память также восстанавливается.

4 голосов
/ 25 марта 2011

Вся куча - выделенная память и вся логика malloc использует для управления - это часть образа процесса, который получает заменены. Это просто исчезает, насколько ваш процесс обеспокоен. Система, конечно же, восстанавливает его и перерабатывает.

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