Вы на правильном пути.По сути, системный вызов fork (2) в старой UNIX создал копию разветвленного процесса с новым PID и новым стеком процесса, скопировав пространство памяти для этого. exec загружает существующий процесс с новым образом.Вы можете увидеть одну версию этого в операции exec
в большинстве оболочек - она указывает желаемое изображение в процессе, который был занят оболочкой.
Когда вы обрабатываете процесс, системный вызов fork возвращаетPID нового процесса, если вы родитель, или 0, если вы ребенок.Дочерний процесс также наследует все дескрипторы открытых файлов, в частности 0,1 и 2, которые более известны как STDIN, STDOUT и STDERR.
(Тест на интересующие вопросы: как, по вашему мнению, оболочка управляет перенаправлениемНапример, с >
?)
Более современные варианты UNIX с большими адресными пространствами (в исходном UNIX было всего 64K слов!) вариант реализации fork, называемый vfork , который копирует только необходимое подмножествопроцесса, чтобы начать работать, и зависит от менеджера памяти, чтобы вытянуть остальные, если это необходимо.Поскольку в большинстве случаев за форком сразу же следует exec, который в любом случае должен загрузить новый образ, это значительная оптимизация.
Мах делает этот шаг дальше;когда вы создаете новый pprocess, ничего не копируется, кроме того, что вам нужно для контекста выполнения;изображение точно такое жеКопирование происходит только тогда, когда процесс изменяет место в памяти, и в этот момент копируется страница, содержащая это место.Это называется «копировать при записи» и является почти оптимальным.