Вопрос о execv и процессе семейных отношений - PullRequest
1 голос
/ 20 августа 2010

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

Ответы [ 4 ]

4 голосов
/ 20 августа 2010

fork создает новый процесс, называемый РЕБЕНКОМ РОДИТЕЛЯ ... exec заменяет текущую запущенную программу процессом exec'd и, следовательно, остается процессом CHILD РОДИТЕЛЯ ...

3 голосов
/ 20 августа 2010

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

2 голосов
/ 20 августа 2010

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

0 голосов
/ 20 августа 2010

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

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

(Тест на интересующие вопросы: как, по вашему мнению, оболочка управляет перенаправлениемНапример, с >?)

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

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

...