A chamada do sistema UNIX para criação de processo, fork (), cria um processo filho, copiando o processo pai. Meu entendimento é que isso quase sempre é seguido por uma chamada para exec () para substituir o espaço de memória do processo filho (incluindo o segmento de texto). Copiar o espaço de memória dos pais no fork () sempre pareceu um desperdício para mim (embora eu perceba que o desperdício pode ser minimizado, fazendo com que os segmentos de memória sejam copiados na gravação para que apenas os ponteiros sejam copiados). Enfim, alguém sabe por que essa abordagem de duplicação é necessária para a criação do processo?
process
process-management
fork
Ellen Spertus
fonte
fonte
fork(2)
página de manual no Linux diz:Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
Imagino (mas não sei ao certo) que esse é o caso de outros sabores modernos do Unix.select
estavam quebrados, mas isso é outra história).Respostas:
É para simplificar a interface. A alternativa
fork
eexec
seria algo como a função CreateProcess do Windows . Observe quantos parâmetrosCreateProcess
possui e muitos deles são estruturas com ainda mais parâmetros. Isso ocorre porque tudo o que você deseja controlar sobre o novo processo deve ser passadoCreateProcess
. De fato,CreateProcess
como não possui parâmetros suficientes, a Microsoft precisou adicionar CreateProcessAsUser e CreateProcessWithLogonW .Com o
fork/exec
modelo, você não precisa de todos esses parâmetros. Em vez disso, certos atributos do processo são preservadosexec
. Isso permite que vocêfork
altere os atributos de processo desejados (usando as mesmas funções que você usaria normalmente) e, em seguidaexec
,. No Linux,fork
não possui parâmetros eexecve
possui apenas 3: o programa a ser executado, a linha de comando a ser fornecida e seu ambiente. (Existem outrasexec
funções, mas são apenas wrappersexecve
fornecidos pela biblioteca C para simplificar casos de uso comuns.)Se você deseja iniciar um processo com um diretório atual diferente:
fork
,chdir
,exec
.Se você deseja redirecionar stdin / stdout:,
fork
feche / abra arquivosexec
,.Se você quiser usuários Switch:
fork
,setuid
,exec
.Todas essas coisas podem ser combinadas conforme necessário. Se alguém criar um novo tipo de atributo de processo, você não precisará alterar
fork
eexec
.Como os larsks mencionaram, a maioria dos Unixes modernos usa cópia na gravação, portanto
fork
, não envolve sobrecarga significativa.fonte
Além da resposta do cjm, a Especificação Unix Única define uma função denominada
vfork()
. Essa função funciona como bifurcação, exceto que o processo bifurcado tem um comportamento indefinido se fizer algo diferente de tentar chamar uma função execut exec familly ou chamar_exit()
.Portanto, praticamente o único uso com comportamento definido é:
Então o que
vfork
faz? É um é baratofork
. Nas implementações sem copiar na gravação, o processo resultante compartilhará espaço de memória com o processo original (daí o comportamento indefinido). Nas implementações com cópia na gravação,vfork
é permitido ser idênticofork()
, pois as implementações de cópia na gravação são rápidas.Há também a
posix_spawn
função opcional (e umaposix_spawnp
função) que pode criar diretamente um novo processo. (Também é permitido implementá-los com uma chamada de biblioteca usandofork
eexec
, e um exemplo de implementação é fornecido.)fonte