Вызов exec
заменяет все адресное пространство ребенка новым адресным пространством.Любое общее адресное пространство будет полностью заменено вызовом.
Функция vfork
существует только в качестве оптимизации.Для некоторых операционных систем fork
очень дорого, потому что дочерний процесс может потенциально изменить любую страницу, отображаемую в памяти, поэтому каждая отдельная страница должна быть модифицирована для копирования при записи (или, фактически, фактически скопирована!), Чтобы не изменятьсоответствующие страницы родителей.Очень распространенная последовательность - это fork
, за которой сразу следует exec
, что заставляет эти системы переназначать все страницы, чтобы отбросить их на долю секунды позже.Вместо того, чтобы пытаться изменить все сопоставления, vfork
позволяет вам оставить сопоставления в неопределенном состоянии в дочернем процессе при условии, что вы все равно не будете их использовать.
КакВ результате, выполнение определенных действий после vfork
может создать беспорядок.Но как только вы вызываете exec
, все неопределенные отображения все равно исчезают.
На практике операционные системы обрабатывают vfork
одним из двух способов: Для операционных систем, где изменение всех отображений для копирования при записи выполняетсянедорогой или в котором не реализована оптимизация vfork
, vfork
идентична fork
.Для операционных систем, которые используют оптимизацию vfork
, vfork
оставляет родительский и дочерний элементы полностью разделяющими большинство страниц, вызывая плохие вещи, если дочерние элементы изменяют их (они изменяют в родительском).
Таким образом,Короткий ответ на ваш вопрос заключается в том, что если бы vfork
был спроектирован таким образом, его нельзя было бы использовать по назначению.