vfork: Понимание проблемы: - PullRequest
1 голос
/ 01 июля 2011

У меня путаница вокруг функциональности vfork().Я читал, что в случае vfork() родительский и дочерний процессы используются для обмена страницами между ними.Он не поддерживает функцию копирования при записи.Это означает, что если во время своего дочернего процесса временного интервала вносятся некоторые изменения, все эти изменения будут видны родительскому процессу, когда он вернется.Также было упомянуто, что системный вызов vfork() полезен только тогда, когда дочерний процесс просто выполняет системный вызов exec после его создания.

Допустим, дочерний процесс выполняет execсистемный вызов с ls.Теперь, согласно вызовам exec, программа ls будет загружена в адресное пространство дочернего процесса.Теперь, когда запустится временной интервал родительского процесса, он может иметь другое вторжение для выполнения на своем ПК, что может привести к тому, что этот процесс будет вести себя по-разному.vfork() Звонок полезен в таких ситуациях?

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Смысл vfork() не в том, чтобы выделять новое адресное пространство для ребенка, который собирается немедленно его снова выбросить. Таким образом, vfork() пропускает часть fork(), которая создает новое адресное пространство (таблицы страниц и выделения) для дочернего элемента, и вместо этого устанавливает флаг, который execve() интерпретирует как означающий, что он должен выделить новую таблицу страниц и стек для процесса перед заполнением его новым исполняемым файлом и его запрошенной начальной кучей (BSS).

0 голосов
/ 12 июля 2011

execve() освобождает отображения памяти текущего процесса и выделяет новые. Выход из процесса также приводит к освобождению отображений памяти этого процесса.

Традиционно, vfork() приостанавливает родительский процесс до тех пор, пока дочерний процесс не прекратит использовать отображения памяти родителя. Единственный способ сделать это безопасно - через execve() или _exit().

Допустим, дочерний процесс выполняет системный вызов exec с левая сторона Теперь, согласно вызовам exec, программа ls будет загружена на в адресное пространство дочернего процесса.

На самом деле, ls будет загружено в новое адресное пространство, адресное пространство родителя освобождается на дочернем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...