Linux x86_64Rede & sockets#288
accept4
Como accept, mas permite definir flags (SOCK_NONBLOCK, SOCK_CLOEXEC) atomicamente no novo socket.
Descrição
Evita a condição de corrida (e o risco de vazamento de descritor entre um fork+exec concorrente) de chamar `accept` seguido de `fcntl(F_SETFL)`/`fcntl(F_SETFD)` separadamente.
Header:
sys/socket.hman 2Desde o kernel 2.6.28Assinatura
int accept4(
int sockfd,
struct sockaddr * addr,
socklen_t * addrlen,
int flags
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| sockfd | int | Socket em modo de escuta. |
| addr | struct sockaddr * | Se não for NULL, recebe o endereço do par remoto. |
| addrlen | socklen_t * | Tamanho de `addr`; atualizado com o tamanho real. |
| flags | int | SOCK_NONBLOCK e/ou SOCK_CLOEXEC. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | sockfdint |
| rsi | argumento 2 | addrstruct sockaddr * |
| rdx | argumento 3 | addrlensocklen_t * |
| r10 | argumento 4 | flagsint |
Valor de retorno
Um novo descritor de socket conectado em sucesso; -1 em erro, com errno definido.
Códigos de erro (errno)
- EAGAIN(11)
- Recurso temporariamente indisponível (tente novamente); também conhecido como EWOULDBLOCK.
- ECONNABORTED(103)
- Conexão abortada localmente.
- EMFILE(24)
- Limite de arquivos abertos do processo atingido.
- ENFILE(23)
- Limite de arquivos abertos no sistema atingido.
- EPERM(1)
- Operação não permitida (falta de privilégio).