Linux x86_64Arquivos & E/S#275
splice
Move dados entre um pipe e outro descritor de arquivo (ou entre dois pipes) sem copiar pelo espaço de usuário.
Descrição
Zero-copy dentro do kernel, como `sendfile`, mas generalizado para funcionar com pipes de/para qualquer descritor, incluindo sockets — base de implementações eficientes de proxies e pipelines de dados.
man 2Desde o kernel 2.6.17
Assinatura
ssize_t splice(
int fd_in,
loff_t * off_in,
int fd_out,
loff_t * off_out,
size_t len,
unsigned int flags
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| fd_in | int | Descritor de origem (um dos dois deve ser um pipe). |
| off_in | loff_t * | Deslocamento em `fd_in`, se aplicável; NULL usa a posição atual. |
| fd_out | int | Descritor de destino (um dos dois deve ser um pipe). |
| off_out | loff_t * | Deslocamento em `fd_out`, se aplicável; NULL usa a posição atual. |
| len | size_t | Número máximo de bytes a mover. |
| flags | unsigned int | SPLICE_F_MOVE, SPLICE_F_NONBLOCK, SPLICE_F_MORE. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | fd_inint |
| rsi | argumento 2 | off_inloff_t * |
| rdx | argumento 3 | fd_outint |
| r10 | argumento 4 | off_outloff_t * |
| r8 | argumento 5 | lensize_t |
| r9 | argumento 6 | flagsunsigned int |
Valor de retorno
Número de bytes movidos 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.
- EBADF(9)
- Descritor de arquivo inválido.
- EINVAL(22)
- Argumento inválido.
- ENOMEM(12)
- Memória insuficiente para completar a operação.
- ESPIPE(29)
- Seek inválido (descritor não posicionável, ex.: pipe).