clone
Cria um novo processo ou thread, com controle detalhado sobre o que é compartilhado com o chamador.
Descrição
Generalização de `fork`: através de flags (CLONE_VM, CLONE_FILES, CLONE_FS, CLONE_THREAD, CLONE_NEWPID, ...) controla precisamente se o filho compartilha espaço de memória, tabela de descritores, sistema de arquivos, ou entra em novos namespaces. É a syscall usada por glibc para implementar `pthread_create`, e por runtimes de container para criar processos isolados.
sched.hman 2Nota
A ordem e o conjunto exato de argumentos crus da syscall variam por arquitetura — a assinatura acima é a exposta pelo wrapper de glibc, não a ABI de baixo nível.
Nota
Para casos de uso modernos de criação de processo, `clone3` (syscall 435) é preferível: usa uma struct extensível em vez de uma longa lista de argumentos posicionais.
Assinatura
long clone(
unsigned long flags,
void * stack,
int * parent_tid,
int * child_tid,
unsigned long tls
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| flags | unsigned long | Máscara de bits controlando o que é compartilhado e o sinal enviado ao pai na terminação do filho. |
| stack | void * | Endereço da pilha a usar para o novo processo/thread (necessário quando CLONE_VM está definido). |
| parent_tid | int * | Se CLONE_PARENT_SETTID, recebe o TID do filho no processo pai. |
| child_tid | int * | Usado com CLONE_CHILD_SETTID/CLONE_CHILD_CLEARTID para gerenciar o TID no filho. |
| tls | unsigned long | Descritor de thread-local storage, usado com CLONE_SETTLS. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | flagsunsigned long |
| rsi | argumento 2 | stackvoid * |
| rdx | argumento 3 | parent_tidint * |
| r10 | argumento 4 | child_tidint * |
| r8 | argumento 5 | tlsunsigned long |
Valor de retorno
No processo pai, o PID/TID do filho; 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.
- EINVAL(22)
- Argumento inválido.
- ENOMEM(12)
- Memória insuficiente para completar a operação.
- EPERM(1)
- Operação não permitida (falta de privilégio).
- EUSERS(87)
- Excesso de usuários.