Я изучаю команды fork () и exec (). Кажется, что fork () и exec () обычно вызываются вместе. (fork () создает новый дочерний процесс, а exec () заменяет текущий образ процесса новым.) Однако в каких случаях вы можете вызывать каждую функцию отдельно? Есть ли такие сценарии?
system-calls
exec
fork
Квил
источник
источник
Ответы:
Конечно! Обычный шаблон в программах-оболочках - это делать разные вещи, а затем заменять себя другой программой, используя только
exec
вызов (без разветвления).Пример из реальной жизни это
GIT_SSH
(хотяgit(1)
также предлагает,GIT_SSH_COMMAND
если вы не хотите делать вышеупомянутый метод программы-оболочки).Только для
httpd
разветвления используется при порождении множества обычно рабочих процессов (например, Apache в режиме разветвления (хотя только разветвление лучше подходит для процессов, которые должны перегружать ЦП, а не для процессов, которые трясут, ожидая сетевого ввода-вывода) ) или для разделения привилегий, используемыхsshd
другими программами в OpenBSD (без exec)У
root
sshd на клиентском соединении разветвленная копия (28571), а затем еще одна копия (14625) для разделения привилегий.источник
Есть много.
Программы, которые вызывают
fork()
безexec()
, обычно следуют шаблону порождения дочерних рабочих процессов для выполнения различных задач в отдельных процессах по отношению к основному. Вы найдете это в программах столь же разнообразны , какdhclient
,php-fpm
иurxvtd
.Программа , которая требует
exec()
неfork()
является последовательной загрузкой , накладывая свой процесс с другой программой изображением. Существует целая субкультура утилит цепной загрузки, которые выполняют определенные действия для обработки состояния, а затем выполняют другую программу для запуска с этим измененным состоянием процесса. Такие утилиты распространены в наборе инструментов семейства сервисов и управления системой daemontools, но не ограничиваются ими. Несколько примеров:chpst
из рунита Геррита Папеs6-softlimit
иs6-envdir
от Лорана Берко s6local-reaper
иmove-to-control-group
из моего набора инструментов Noshrdprio
иidprio
на FreeBSDnumactl
на FreeBSD и LinuxВ Daemontools семья наборов инструментов есть много таких инструментов, с
machineenv
помощьюfind-matching-jvm
кruntool
.источник
В дополнение к другим ответам, отладчики, использующие
ptrace
, обычно используют разрыв междуfork
иexec
. Отладчик должен пометить себя,PTRACE_TRACEME
чтобы указать, что он отслеживается его родительским процессом - отладчиком. Это должно дать необходимые разрешения отладчику.Таким образом, отладчик сначала сам разветвляется. Ребенок позвонит
ptrace
с,PTRACE_TRACEME
а затем позвонитexec
. В зависимости от того, какая программа дочернего исполнителя будет отслеживаться родителем.источник
Exec без вилки
Есть по крайней мере две причины, почему вы хотели бы сделать такую вещь:
вилка без exec
Это то, что делает каждый демон каждый раз, когда он запускается (действительно, дважды). Это делает несколько вещей, в том числе оболочка не зависает (поскольку исходный процесс, на котором она находится, завершается), и демон больше не контролируется терминалом, поэтому закрытие окна оболочки не убивает демона.
Другое распространенное использование - это разветвление детей-работников, которое стало известным благодаря веб-серверу apache около 25 лет назад (в настоящее время это больше не считается современным из-за того, что оно очень склонно к проблеме стада грома, но оно, безусловно, обеспечивает чертовски простой, самый надежный сервер из всех возможных).
Еще одно распространенное использование - создание последовательного снимка.
fork
не только создает процесс, но и копирует (теоретически, на самом деле он только помечает страницы, копируемые при записи) адресное пространство. Это (атомарно) создает снимок полных данных программы, которые родительский объект больше не может изменять.Некоторые программы используют это преимущество. Например, Redis сохраняет данные на диск (в согласованном состоянии), одновременно изменяя набор данных одновременно. Это работает только потому, что
fork
создан непротиворечивый снимок, который не видит изменений, внесенных родительским процессом.источник