ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
ОПИСАНИЕ
Этот вызов производит обмен данными между двумя описателями.
Один или оба описателя могут быть сокетами (см. ниже).
in_fd
должен быть открытым для чтения описателем файла, а
out_fd
должен быть описателем, открытым для записи.
offset
является переменной, указывающей
sendfile()
начало необходимых для считывания данных. После выполнения функции
sendfile()
эта переменная указывает на байт, находящийся за
последним считанным байтом.
count
это количество байтов, подлежащих копированию, между двумя описателями файлов.
Так-как это копирование выполняется без участия ядра, то
sendfile()
не тратит время на пересылку данных из/в область пользователя.
ЗАМЕЧАНИЯ
Sendfile не изменяет указатель
in_fd,
но изменяет указатель
out_fd.
Если Вы хотите использовать sendfile для пересылки файлов в сокет TCP и
требуется послать заголовочные данные в начало содержимого файлов, то обращайтесь
за помощью к опции
TCP_CORK
в
tcp(7)
Это поможет уменьшить количество пакетов и оптимизировать выполнение функции.
В настоящее время описатель из которого читаются данные, не может соответствовать
сокету, он может соответствовать файлу, который поддерживает mmap()-подобные операции.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Если пересылка прошла успешно, то возвращается значение
out_fd,
где указано количество переданных байтов. При ошибке возвращается -1,
а переменной
errno
присваивается номер ошибки.
НАЙДЕННЫЕ ОШИБКИ
EBADF
Входной файл не был открыт для чтения или результирующий файл не был открыт
для записи.
EINVAL
Неправильный описатель, или нет прав на доступ к нему.
ENOMEM
Не хватает памяти для чтения
in_fd.
EIO
Неизвестная ошибка при чтении
in_fd.
ВЕРСИИ
sendfile
впервые включена в Linux 2.2.
Файл заголовков <sys/sendfile.h> представлен начиная с glibc2.1.
Другие ОС семейства Unix часто используют
sendfile
с различным синтаксисом. Эта функция не должна быть использована в программах,
переносимых в другие системы.