Eu estava procurando encontrar a diferença entre esses quatro no Google e esperava que houvesse uma quantidade enorme de informações sobre isso, mas realmente não havia uma comparação sólida entre as quatro chamadas.
Comecei a tentar compilar uma espécie de visão geral básica das diferenças entre essas chamadas de sistema e aqui está o que recebi. Todas essas informações estão corretas / estou perdendo alguma coisa importante?
Fork
: A chamada de fork basicamente faz uma duplicata do processo atual, idêntica em quase todos os aspectos (nem tudo é copiado, por exemplo, nos limites de recursos em algumas implementações, mas a idéia é criar uma cópia o mais próxima possível).
O novo processo (filho) obtém um ID de processo diferente (PID) e tem o PID do processo antigo (pai) como seu PID pai (PPID). Como os dois processos agora estão executando exatamente o mesmo código, eles podem dizer qual é o código de retorno do fork - a criança recebe 0, o pai recebe o PID da criança. Isso é tudo, é claro, supondo que a chamada da bifurcação funcione - caso contrário, nenhum filho será criado e o pai receberá um código de erro.
Vfork
: A diferença básica entre vfork e fork é que, quando um novo processo é criado com vfork (), o processo pai é suspenso temporariamente e o processo filho pode pedir emprestado o espaço de endereço do pai. Esse estranho estado de coisas continua até que o processo filho saia ou chame execve (), quando o processo pai continua.
Isso significa que o processo filho de um vfork () deve ter cuidado para evitar alterações inesperadas nas variáveis do processo pai. Em particular, o processo filho não deve retornar da função que contém a chamada vfork () e não deve chamar exit () (se precisar sair, deve usar _exit (); na verdade, isso também é verdade para o filho de um garfo normal ()).
Exec :
A chamada exec é uma maneira de substituir basicamente todo o processo atual por um novo programa. Ele carrega o programa no espaço de processo atual e o executa a partir do ponto de entrada. exec () substitui o processo atual por um executável apontado pela função. O controle nunca retorna ao programa original, a menos que haja um erro exec ().
Clone :
Clone, como fork, cria um novo processo. Diferentemente da bifurcação, essas chamadas permitem que o processo filho compartilhe partes de seu contexto de execução com o processo de chamada, como espaço de memória, tabela de descritores de arquivo e tabela de manipuladores de sinal.
Quando o processo filho é criado com o clone, ele executa o aplicativo de função fn (arg). (Isso difere da bifurcação, onde a execução continua no filho a partir do ponto da chamada de bifurcação original.) O argumento fn é um ponteiro para uma função chamada pelo processo filho no início de sua execução. O argumento arg é passado para a função fn.
Quando o aplicativo da função fn (arg) retorna, o processo filho termina. O número inteiro retornado por fn é o código de saída para o processo filho. O processo filho também pode terminar explicitamente chamando exit (2) ou após receber um sinal fatal.
Informações obtidas:
- Diferenças entre fork e exec
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
Obrigado por tomar o tempo para ler este ! :)
fork()
que está no Linux e provavelmente todos os BSDs) emprestar o espaço de endereço de seus pais. Tudo o que faz, além de chamar execve()
ou _exit()
, tem um grande potencial para atrapalhar os pais. Em particular, exit()
chama atexit()
manipuladores e outros "finalizadores", por exemplo: libera fluxos stdio. O retorno de um vfork()
filho potencialmente (com a mesma ressalva de antes) prejudicaria a pilha dos pais.
fork
syscall?