Linux x86_64Arquivos & E/S#40
sendfile
Copia dados diretamente entre dois descritores de arquivo dentro do kernel, sem transitar por espaço de usuário.
Descrição
Usada classicamente por servidores HTTP para servir arquivos estáticos: evita o par de cópias read()+write() através de um buffer em espaço de usuário, reduzindo trocas de contexto e cópias de memória (zero-copy, quando o hardware/driver suporta).
Header:
sys/sendfile.hman 2Nota
Para copiar entre dois arquivos comuns (não sockets), `copy_file_range` costuma ser a escolha mais moderna e pode aproveitar cópia do lado do servidor em sistemas de arquivos de rede.
Assinatura
ssize_t sendfile(int out_fd, int in_fd, off_t * offset, size_t count);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| out_fd | int | Descritor de saída. |
| in_fd | int | Descritor de entrada (deve suportar mmap-like, tipicamente um arquivo comum). |
| offset | off_t * | Se não for NULL, posição inicial de leitura em `in_fd`; atualizada com a nova posição. |
| count | size_t | Número máximo de bytes a copiar. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | out_fdint |
| rsi | argumento 2 | in_fdint |
| rdx | argumento 3 | offsetoff_t * |
| r10 | argumento 4 | countsize_t |
Valor de retorno
Número de bytes transferidos 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.
- EIO(5)
- Erro de E/S físico.
- ENOMEM(12)
- Memória insuficiente para completar a operação.
- EOVERFLOW(75)
- Valor grande demais para o tipo de dado de destino.