Подтвердить что ты не робот

Что происходит с памятью malloc'ed после того, как exec() изменяет изображение программы?

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

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

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

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

4b9b3361

Ответ 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 использует для управления им - это часть образа процесса, который получает заменены. Он просто исчезает, насколько ваш процесс обеспокоен. Система, конечно же, восстанавливает ее и перерабатывает.