Нет, ядро организует, чтобы это не было проблемой.Я уже не помню точных подробностей, но общая процедура такова: когда процесс вызывает vfork
, ядро сохраняет указатель стека и ПК и выполняет часть настройки для дочернего процесса.Когда процесс, вызвавший vfork
, вызывает execve
, ядро создает новое адресное пространство для нового образа программы вместо перезаписи адресного пространства вызывающего процесса.Затем он возвращает указатель стека родителя и ПК к тому, что было раньше, и родитель продолжает работу с точки vfork
.
Онлайн-страницы для vfork
неутешительно расплывчаты и имеют неприятные комментариио его опасности и отсутствии утилиты, что несправедливо - она действительно более эффективна, чем fork
, даже с разделением адресного пространства при копировании при записи, потому что ей не нужно очищать TLB или делать почти столько жеработают в ядре, и его семантика довольно одинакова для всех операционных систем, все еще широко используемых.Обработка ошибок - боль в заднице, но обработка ошибок с простым fork
столь же плоха, если вы серьезно относитесь к этому.
[Кто-нибудь знает, безопасно ли выполнять настройку перенаправления ввода / вывода вмежду vfork
и execve
?Стандарт не гарантирует этого, и man-страницы также не гарантируют, но я помню, что операции открытия / закрытия / дублирования в этом окне влияют только на потомков, как в случае fork
.]