Как работает копирование при записи в fork-exec?

Процесс fork является дочерним процессом и вызывает exec() в дочернем процессе. При копировании при записи после fork родительский и дочерний процессы совместно используют память.

Когда дочерний процесс вызывает exec() для загрузки другого процесса, скопирует ли Linux родительскую память в новую память, а дочерний процесс также загрузит в эту новую память другой процесс? Если да, означает ли это, что процесс, разветвленный с помощью копирования при записи, не получил данных при выполнении fork-exec?


person leng    schedule 08.08.2015    source источник
comment
ребенок получает новое адресное пространство. не родитель   -  person Raghu Srikanth Reddy    schedule 08.08.2015
comment
Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, потому что он больше подходит для Unix & Linux SE.   -  person Cristian Ciupitu    schedule 08.08.2015
comment
Кроме того, я думаю, что у Google уже есть ответ на этот вопрос.   -  person larsks    schedule 08.08.2015


Ответы (1)


При копировании при записи после fork родительский и дочерний процессы совместно используют память.

Да для чтения и нет для записи. Для разветвленного дочернего процесса создается новое адресное пространство, но оно не заполняется до тех пор, пока дочерний процесс не произведет запись в него.

Если за fork() сразу следует exec(), адресное пространство, созданное для дочернего процесса во время fork()ing, обычно не используется, а заменяется новым, а именно созданным для процесса exec ()ed.

person alk    schedule 08.08.2015
comment
Мне кажется, ключевое недоразумение в вопросе заключается в том, что exec полностью заменяет исходные отображения памяти совершенно новым набором, совершенно не связанным с теми, что были в процессе pre-exec. Некоторые атрибуты переносятся в исполняемый процесс (например, большинство файловых дескрипторов), но многие нет (сегменты общей памяти, сегменты отображаемой памяти и т. д.). - person Jonathan Leffler; 08.08.2015