Voltar à lista
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âmetroTipoDescrição
fd_inintDescritor de origem (um dos dois deve ser um pipe).
off_inloff_t *Deslocamento em `fd_in`, se aplicável; NULL usa a posição atual.
fd_outintDescritor de destino (um dos dois deve ser um pipe).
off_outloff_t *Deslocamento em `fd_out`, se aplicável; NULL usa a posição atual.
lensize_tNúmero máximo de bytes a mover.
flagsunsigned intSPLICE_F_MOVE, SPLICE_F_NONBLOCK, SPLICE_F_MORE.

Registradores (x86_64)

RegistradorPapelArgumento
raxnúmero da syscall (chamada) / valor de retorno (após SYSCALL)
rdiargumento 1fd_inint
rsiargumento 2off_inloff_t *
rdxargumento 3fd_outint
r10argumento 4off_outloff_t *
r8argumento 5lensize_t
r9argumento 6flagsunsigned 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).

Relacionadas