Voltar à lista
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 2

Nota

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âmetroTipoDescrição
out_fdintDescritor de saída.
in_fdintDescritor de entrada (deve suportar mmap-like, tipicamente um arquivo comum).
offsetoff_t *Se não for NULL, posição inicial de leitura em `in_fd`; atualizada com a nova posição.
countsize_tNúmero máximo de bytes a copiar.

Registradores (x86_64)

RegistradorPapelArgumento
raxnúmero da syscall (chamada) / valor de retorno (após SYSCALL)
rdiargumento 1out_fdint
rsiargumento 2in_fdint
rdxargumento 3offsetoff_t *
r10argumento 4countsize_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.

Relacionadas