Linux x86_64Processos & threads#424
pidfd_send_signal
Envia um sinal a um processo referenciado por um pidfd (descritor de arquivo estável), em vez de por PID numérico.
Descrição
Resolve a condição de corrida clássica de `kill(pid, sig)`: entre obter um PID e enviar o sinal, o processo original pode ter terminado e o número ter sido reciclado para outro processo completamente diferente. Um pidfd, como qualquer descritor de arquivo, sempre se refere ao mesmo processo (ou fica inválido), nunca é 'reciclado' silenciosamente.
man 2Desde o kernel 5.1
Assinatura
int pidfd_send_signal(
int pidfd,
int sig,
siginfo_t * info,
unsigned int flags
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| pidfd | int | Descritor de arquivo referenciando o processo alvo (obtido via pidfd_open ou clone/clone3). |
| sig | int | Número do sinal a enviar. |
| info | siginfo_t * | Dados adicionais anexados ao sinal, ou NULL. |
| flags | unsigned int | Reservado; deve ser 0. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | pidfdint |
| rsi | argumento 2 | sigint |
| rdx | argumento 3 | infosiginfo_t * |
| r10 | argumento 4 | flagsunsigned int |
Valor de retorno
0 em sucesso; -1 em erro, com errno definido.
Códigos de erro (errno)
- EBADF(9)
- Descritor de arquivo inválido.
- EINVAL(22)
- Argumento inválido.
- EPERM(1)
- Operação não permitida (falta de privilégio).
- ESRCH(3)
- Processo inexistente.