Linux x86_64Arquivos & E/S#278
vmsplice
Move páginas de memória do espaço de usuário para um pipe, potencialmente sem cópia.
Descrição
Complementa `splice`, permitindo alimentar um pipe diretamente a partir de buffers de memória do processo em vez de outro descritor de arquivo.
man 2Desde o kernel 2.6.17
Atenção
Com SPLICE_F_GIFT, as páginas são efetivamente doadas ao kernel — o processo não deve mais modificar essa memória diretamente.
Assinatura
ssize_t vmsplice(
int fd,
const struct iovec * iov,
unsigned long nr_segs,
unsigned int flags
);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| fd | int | Descritor do pipe de destino. |
| iov | const struct iovec * | Vetor de buffers de origem em memória. |
| nr_segs | unsigned long | Número de elementos em `iov`. |
| flags | unsigned int | SPLICE_F_GIFT, SPLICE_F_NONBLOCK, entre outras. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | fdint |
| rsi | argumento 2 | iovconst struct iovec * |
| rdx | argumento 3 | nr_segsunsigned long |
| r10 | argumento 4 | flagsunsigned int |
Valor de retorno
Número de bytes movidos 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.
- ENOMEM(12)
- Memória insuficiente para completar a operação.