Quando chamar fork () e exec () sozinhos?

9

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?

quil
fonte
2
Forkbomb tradicional: enquanto (1) fork (); consumir recursos do sistema.
Joshua

Respostas:

22

Certo! Um padrão comum nos programas "wrapper" é fazer várias coisas e depois se substituir por outro programa com apenas uma execchamada (sem bifurcação)

#!/bin/sh
export BLAH_API_KEY=blub
...
exec /the/thus/wrapped/program "$@"

Um exemplo real disso é GIT_SSH(embora git(1)também ofereça GIT_SSH_COMMANDse você não deseja executar o método do programa de invólucro acima).

O httpdfork -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 por sshde outros programas no OpenBSD (sem exec)

$ doas pkg_add pstree
...
$ pstree | grep sshd
 |-+= 70995 root /usr/sbin/sshd
 | \-+= 28571 root sshd: jhqdoe [priv] (sshd)
 |   \-+- 14625 jhqdoe sshd: jhqdoe@ttyp6 (sshd)

O rootsshd no cliente conectou uma cópia de si mesma (28571) e outra cópia (14625) para a separação de privilégios.

agitar
fonte
14

Há muitos.

Os programas que chamam fork()sem exec()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 como dhclient, php-fpm, e urxvtd.

Um programa que chama exec()sem fork()é 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:

Os conjuntos de ferramentas da família daemontools têm muitas dessas ferramentas, de machineenvaté find-matching-jvma runtool.

JdeBP
fonte
2

Além de outras respostas, os depuradores, usando ptrace, normalmente fazem uso da diferença entre forke exec. Um depurador deve se marcar PTRACE_TRACEMEpara 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 ptracecom PTRACE_TRACEMEe depois ligaria exec. Qualquer que seja o programa que os executivos filhos sejam agora rastreáveis ​​pelo pai.

bytefire
fonte
Existem muitos exemplos de ações entre fork e exec, sendo o mais comum o redirecionamento de E / S (por exemplo, configuração de pipes). Mas a questão é sobre fazer fork sem nenhum executivo.
Barmar 25/10
0

exec sem garfo

Há pelo menos duas razões pelas quais você gostaria de fazer uma coisa dessas:

  1. Carregamento de corrente. A imagem do processo atual é substituída por algo diferente.
  2. Reiniciar o programa em execução no momento (pode, por exemplo, acontecer quando você SIGHUP ou um processo desse servidor, recarrega tudo e faz um início completamente novo). De alguma forma, alguém poderia argumentar que isso é carregamento em cadeia, apenas coincidencialmente com o mesmo programa.

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. forkalé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 forkcriou um instantâneo consistente que não vê as modificações feitas pelo processo pai.

Damon
fonte
Atualmente, são muito poucos daemons hoje em dia, com a maioria não fazendo isso como padrão ou tendo um modo comumente usado para não fazê-lo. É um erro bifurcar-se levando a incompatibilidade de prontidão e horrores , e é um dos erros da falácia da desmonização . Este erro finalmente caiu amplamente em desuso.
JdeBP