Вопрос об execv и процессе семейных отношений

После того, как процесс разветвляется, и разветвленный сын вызывает execv, результат все еще остается сыном отца?

4 ответа

Решение

fork создает новый процесс, который называется CHILD of PARENT.....exec заменяет текущую запущенную программу на процесс exec'd и поэтому остается процессом CHILD PARENT...

Да. execv не создает новый процесс - вот почему вам нужно сначала разветвиться.

Да, это. Кроме того, терминология "семейство процессов" неудобно близка к "группе процессов", что является довольно важной концепцией.

Вы на правильном пути. По сути, системный вызов fork(2) в старой UNIX создал копию разветвленного процесса с новым PID и новым стеком процессов, скопировав пространство памяти для этого. Exec загружает существующий процесс с новым образом. Вы можете увидеть одну версию этого в exec Операция в большинстве оболочек - это необязательное изображение в процессе, который был занят оболочкой.

Когда вы обрабатываете процесс, системный вызов fork возвращает PID нового процесса, если вы родитель, или 0, если вы дочерний процесс. Дочерний процесс также наследует все дескрипторы открытого файла, в частности 0,1 и 2, которые более известны как STDIN, STDOUT и STDERR.

(Pop quiz: как вы думаете, оболочка управляет перенаправлением, например, с >?)

Более современные варианты UNIX с большими адресными пространствами (в исходном UNIX было всего 64 КБ слов!) Реализован вариантный форк, называемый vfork, который копирует только необходимое подмножество процесса для запуска и зависит от менеджера памяти, который извлекает остальные, если это необходимо, Поскольку в большинстве случаев за форком сразу же следует exec, который в любом случае должен загрузить новый образ, это значительная оптимизация.

Мах делает этот шаг дальше; когда вы создаете новый pprocess, ничего не копируется, кроме того, что вам нужно для контекста выполнения; изображение точно такое же Копирование происходит только тогда, когда процесс изменяет место в памяти, после чего страница, содержащая это место, копируется. Это называется "копировать при записи" и является почти оптимальным.

Другие вопросы по тегам