Создание дочернего процесса БЕЗ fork () - PullRequest
0 голосов
/ 11 января 2019

Есть ли способ запустить дочерний процесс без fork(), используя исключительно execvp()?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

педантичный ответ на ваш вопрос - нет. Системный вызов only , который создает новый процесс, - fork. Системный вызов, лежащий в основе execvp (называемый execve), загружает новую программу в существующий процесс, что является другим.

Некоторые виды Unix имеют дополнительные системные вызовы помимо fork (например, vfork, rfork, clone), которые создают новый процесс, но они представляют собой лишь небольшие вариации самого fork, и ни один из они являются частью стандарта POSIX, который определяет функциональность, на которую вы можете рассчитывать на что угодно , которое называет себя Unix.

Чуть более полезный ответ заключается в том, что вы, возможно, искали posix_spawn, который представляет собой библиотечную процедуру, заключающую fork и exec в одну операцию, но я нахожу больше проблематичным используйте это правильно, чем написать мою собственную подпрограмму fork + exec. YMMV.

0 голосов
/ 11 января 2019

В отличие от систем Windows, где создание нового процесса и запуск нового образа процесса происходит за один шаг, Linux и другие UNIX-подобные системы выполняют их как два отдельных шага.

Функция fork создает точную копию вызывающего процесса и фактически возвращает дважды, один раз родительскому процессу и один раз дочернему процессу. Функция execvp (и другие функции в семействе exec) выполняет новый образ процесса в том же процессе, перезаписывая существующий образ процесса.

Вы можете позвонить execvp без предварительного вызова fork. Если это так, то это означает, что текущая программа исчезает и заменяется данной программой. Однако fork - это способ для создания нового процесса.

...