fork()
foi a chamada original do sistema UNIX. Só pode ser usado para criar novos processos, não threads. Além disso, é portátil.
No Linux, clone()
é uma chamada de sistema nova e versátil que pode ser usada para criar um novo thread de execução. Dependendo das opções passadas, o novo thread de execução pode aderir à semântica de um processo UNIX, um thread POSIX, algo intermediário ou algo completamente diferente (como um contêiner diferente). Você pode especificar todos os tipos de opções que determinam se a memória, os descritores de arquivos, os vários namespaces, os manipuladores de sinais e assim por diante serão compartilhados ou copiados.
Como clone()
é a chamada de sistema de superconjunto, a implementação do invólucro de chamada de sistema fork()
na glibc realmente chama clone()
, mas esse é um detalhe de implementação que os programadores não precisam conhecer. A verdadeira chamada de sistema fork()
real ainda existe no kernel Linux por razões de retrocompatibilidade, embora tenha se tornado redundante, porque programas que usam versões muito antigas da libc, ou outra libc além da glibc, podem usá-la.
clone()
também é usado para implementar a função pthread_create()
POSIX para criar encadeamentos.
Os programas portáteis devem chamar fork()
e pthread_create()
, não clone()
.