Что происходит с памятью malloc'ed после того, как exec() изменяет изображение программы?
Я знаю, что когда я вызываю один из системных вызовов exec()
в Linux, он заменит текущий выполняемый процесс новым изображением. Поэтому, когда я развиваю новый процесс и запускаю exec()
, ребенок будет заменен новым процессом.
Что происходит с любой памятью, которую я выделил из кучи? Скажем, я хочу разобрать произвольное количество команд и отправить его в exec()
. Чтобы удержать это произвольное число, мне, вероятно, придется выделить память в какой-то момент, так как я не думаю, что смогу сделать это правильно со статическими массивами, поэтому я, скорее всего, буду использовать malloc()
или что-то подобное.
Мне нужно сохранить эту память до тех пор, пока я не позвоню exec()
, но exec()
никогда не вернется.
Восстановлена ли память операционной системой?
Ответы
Ответ 1
Когда вы вызываете 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()
, память все еще доступна в родительском процессе.
EDIT: Современные реализации malloc()
используют анонимные сопоставления памяти, см. mmap (2). Согласно execve (2), отображения памяти не сохраняются по вызову exec()
, поэтому эта память также исправлена.
Ответ 2
Вся память, выделенная кучей, и все логические malloc
использует для управления им - это часть образа процесса, который получает
заменены. Он просто исчезает, насколько ваш процесс
обеспокоен. Система, конечно же, восстанавливает ее и перерабатывает.