Linux x86_64Processos & threads#59
execve
Substitui a imagem do processo atual por um novo programa.
Descrição
Não cria um novo processo — o PID permanece o mesmo, mas código, dados, pilha e heap são completamente substituídos pelo novo executável. Combinado com `fork`/`clone`/`vfork`, forma o padrão fork+exec característico do Unix para iniciar novos programas.
Header:
unistd.hman 2Nota
Descritores de arquivo abertos sobrevivem ao exec, exceto os marcados com a flag close-on-exec (FD_CLOEXEC) — por isso é boa prática abrir descritores sensíveis já com O_CLOEXEC.
Assinatura
int execve(const char * pathname, char *const[] argv, char *const[] envp);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| pathname | const char * | Caminho do executável (binário ou script com shebang). |
| argv | char *const[] | Array de argumentos, terminado em NULL; argv[0] convencionalmente é o nome do programa. |
| envp | char *const[] | Array de variáveis de ambiente no formato "NOME=valor", terminado em NULL. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | pathnameconst char * |
| rsi | argumento 2 | argvchar *const[] |
| rdx | argumento 3 | envpchar *const[] |
Valor de retorno
Não retorna em sucesso (o programa antigo deixou de existir); -1 em erro, com errno definido.
Códigos de erro (errno)
- EACCES(13)
- Permissão negada.
- EAGAIN(11)
- Recurso temporariamente indisponível (tente novamente); também conhecido como EWOULDBLOCK.
- ENOENT(2)
- Arquivo ou diretório inexistente.
- ENOEXEC(8)
- Formato de executável inválido.
- ENOMEM(12)
- Memória insuficiente para completar a operação.
- E2BIG(7)
- Lista de argumentos grande demais.
- ELOOP(40)
- Excesso de níveis de links simbólicos (loop de symlinks).