fork
Cria uma cópia do processo chamador como um novo processo filho.
Descrição
O filho recebe uma cópia (copy-on-write, portanto barata até que haja escrita) do espaço de memória, mas descritores de arquivo, IDs de processo e a maior parte do estado do kernel são tratados separadamente conforme a semântica POSIX. É a base histórica de criação de processos no Unix — em Linux é implementada como uma chamada a `clone` com um conjunto padrão de flags.
unistd.hman 2Atenção
Em processos multi-thread, apenas a thread chamadora é duplicada no filho — as demais threads simplesmente deixam de existir nele, o que torna o uso de locks/mutexes ao redor de `fork` uma fonte clássica de deadlock (o filho pode herdar um mutex travado por uma thread que não existe mais nele).
Assinatura
pid_t fork(void);Parâmetros
Esta função não recebe parâmetros.
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
Valor de retorno
PID do filho no processo pai; 0 no processo filho, em sucesso. -1 no pai em erro, com errno definido.
Códigos de erro (errno)
- EAGAIN(11)
- Recurso temporariamente indisponível (tente novamente); também conhecido como EWOULDBLOCK.
- ENOMEM(12)
- Memória insuficiente para completar a operação.
- ENOSYS(38)
- Chamada de sistema não implementada nesta versão do kernel.