Portanto, quando um comando é acionado a partir de um shell, o fork () herda um processo filho e o exec () carrega o processo filho na memória e é executado.
Não é bem assim. fork()
clona o processo atual, criando um filho idêntico. exec()
carrega um novo programa no processo atual, substituindo o existente.
Meu qs é:
Se o processo filho contiver todos os atributos do processo pai (que é o processo original), qual é a necessidade desse processo filho? O processo original também pode ter sido carregado na memória.
A necessidade é porque o processo pai ainda não deseja finalizar; ele quer que um novo processo seja executado e faça algo ao mesmo tempo em que continua sendo executado.
Esse conceito de fork e exec se aplica a todo o programa executável no UNIX, como também para scripts de shell ou apenas para comandos? Também se aplica a comandos internos do shell?
Para comandos externos, o shell faz fork()
isso para que o comando seja executado em um novo processo. Builtins são apenas executados diretamente pelo shell. Outro comando notável é o exec
que informa o shell ao exec()
programa externo sem primeiro fork()
. Isso significa que o próprio shell é substituído pelo novo programa e, portanto, não está mais lá para que o programa retorne quando sair. Se você diz, exec true
e depois /bin/true
irá substituir o seu shell, e imediatamente saída, não deixando nada em execução no seu terminal mais, então ele será fechado.
quando copiar no conceito de gravação é usado se eu executar um comando / script?
Na era da pedra, fork()
na verdade , era necessário copiar toda a memória do processo de chamada para o novo processo. Copy on Write é uma otimização em que as tabelas de páginas são configuradas para que os dois processos comecem a compartilhar toda a mesma memória e apenas as páginas que são gravadas por qualquer processo são copiadas quando necessário.