Когда вы звоните 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()
, поэтому эта память также восстанавливается.