Voltar à lista
Linux x86_64Processos & threads#56

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.

Header: sched.hman 2

Nota

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âmetroTipoDescrição
flagsunsigned longMáscara de bits controlando o que é compartilhado e o sinal enviado ao pai na terminação do filho.
stackvoid *Endereço da pilha a usar para o novo processo/thread (necessário quando CLONE_VM está definido).
parent_tidint *Se CLONE_PARENT_SETTID, recebe o TID do filho no processo pai.
child_tidint *Usado com CLONE_CHILD_SETTID/CLONE_CHILD_CLEARTID para gerenciar o TID no filho.
tlsunsigned longDescritor de thread-local storage, usado com CLONE_SETTLS.

Registradores (x86_64)

RegistradorPapelArgumento
raxnúmero da syscall (chamada) / valor de retorno (após SYSCALL)
rdiargumento 1flagsunsigned long
rsiargumento 2stackvoid *
rdxargumento 3parent_tidint *
r10argumento 4child_tidint *
r8argumento 5tlsunsigned 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.

Relacionadas