Estou aprendendo sobre os comandos fork () e exec (). Parece que fork () e exec () geralmente são chamados juntos. (fork () cria um novo processo filho e exec () substitui a imagem do processo atual por uma nova.) No entanto, em quais cenários você pode chamar cada função por conta própria? Existem cenários como esses?
system-calls
exec
fork
quil
fonte
fonte
Respostas:
Certo! Um padrão comum nos programas "wrapper" é fazer várias coisas e depois se substituir por outro programa com apenas uma
exec
chamada (sem bifurcação)Um exemplo real disso é
GIT_SSH
(emboragit(1)
também ofereçaGIT_SSH_COMMAND
se você não deseja executar o método do programa de invólucro acima).O
httpd
fork -only é usado ao gerar um monte de processos tipicamente de trabalho (por exemplo, Apache no modo fork (embora apenas o fork se adapte melhor aos processos que precisam queimar a CPU e não àqueles que agitam o polegar à espera da E / S da rede) ) ou para a separação de privilégios usada porsshd
e outros programas no OpenBSD (sem exec)O
root
sshd no cliente conectou uma cópia de si mesma (28571) e outra cópia (14625) para a separação de privilégios.fonte
Há muitos.
Os programas que chamam
fork()
semexec()
geralmente seguem um padrão de processos de trabalhador filho reprodutor para executar várias tarefas em processos separados para o principal. Você vai encontrar isso em programas tão variados comodhclient
,php-fpm
, eurxvtd
.Um programa que chama
exec()
semfork()
é o carregamento em cadeia , cobrindo seu processo com uma imagem de programa diferente. Existe toda uma subcultura de utilitários de carregamento em cadeia que faz coisas específicas para processar o estado e, em seguida, executa outro programa para executar com esse estado de processo revisado. Esses utilitários são comuns na família de serviços daemontools e nos conjuntos de ferramentas de gerenciamento de sistemas, mas não estão limitados a eles. Alguns exemplos:chpst
do runit de Gerrit Papes6-softlimit
es6-envdir
do s6 de Laurent Bercotlocal-reaper
emove-to-control-group
do meu conjunto de ferramentas noshrdprio
eidprio
no FreeBSDnumactl
no FreeBSD e LinuxOs conjuntos de ferramentas da família daemontools têm muitas dessas ferramentas, de
machineenv
atéfind-matching-jvm
aruntool
.fonte
Além de outras respostas, os depuradores, usando
ptrace
, normalmente fazem uso da diferença entrefork
eexec
. Um depurador deve se marcarPTRACE_TRACEME
para indicar que está sendo rastreado pelo processo pai - o depurador. Isso é para conceder as permissões necessárias ao depurador.Portanto, um depurador primeiro se bifurca. A criança ligaria
ptrace
comPTRACE_TRACEME
e depois ligariaexec
. Qualquer que seja o programa que os executivos filhos sejam agora rastreáveis pelo pai.fonte
exec sem garfo
Há pelo menos duas razões pelas quais você gostaria de fazer uma coisa dessas:
garfo sem exec
É o que todo daemon faz toda vez que é iniciado (duas vezes, de fato). Isso faz várias coisas, entre elas o shell não trava (já que o processo original que o shell aguarda termina) e o daemon não é mais controlado pelo terminal, portanto, fechar a janela do shell não mata o daemon.
Outro uso comum é a bifurcação de crianças trabalhadoras, que ficou famosa pelo servidor da Web apache há cerca de 25 anos (hoje em dia isso não é mais considerado o estado da arte devido a ser muito propenso ao problema do rebanho trovejante, mas com certeza fornece o servidor mais simples e robusto possível).
Ainda outro uso comum é criar um instantâneo consistente.
fork
além de criar um processo, ele também copia (em teoria, na realidade, apenas marca as páginas copiadas na gravação) no espaço de endereço. Isso (atomicamente) cria uma captura instantânea dos dados completos do programa que o pai não pode mais modificar.Alguns programas aproveitam isso. Por exemplo, redis salva dados no disco (em um estado consistente) e ao mesmo tempo modifica o conjunto de dados simultaneamente. Isso funciona apenas porque
fork
criou um instantâneo consistente que não vê as modificações feitas pelo processo pai.fonte