Other Alias
pwrite
ОБЗОР
#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
pread(), pwrite():
_XOPEN_SOURCE >= 500|| /* начиная с glibc 2.12: */ _POSIX_C_SOURCE >= 200809L
ОПИСАНИЕ
pread() читает максимум count байтов из файлового дескриптора fd,
начиная со смещения offset (от начала файла), в буфер, начиная с
buf. Текущая позиция файла не изменяется.
pwrite() записывает максимум count байтов из буфера buf в файловый дескриптор fd , начиная со смещения offset. Текущая позиция файла не изменяется.
Файл, заданный в fd, должен позволять изменение смещения.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении pread() возвращается количество считанных байт
(ноль указывает на конец файла), а pwrite() — количество записанных байт.
Заметим, что для успешного выполнения не считается ошибкой передача меньшего количества байт чем запрошено (смотрите read(2) и write(2)).
При ошибке возвращается -1, а в errno содержится код ошибки.
ОШИБКИ
Вызов pread() может завершиться неудачно и записать в errno один из
кодов ошибки, определённых для read(2) или lseek(2). Вызов pwrite()
может завершиться неудачно и записать в errno один из кодов ошибки,
определённых для write(2) или lseek(2).
ВЕРСИИ
Системные вызовы pread() и pwrite() были внесены в ядро Linux, начиная с версии 2.1.60; как элементы таблицы системных вызовов i386 были добавлены в ядро версии 2.1.69. Поддержка в библиотеке С (включая эмуляцию с помощью lseek(2) в старых ядрах, не имеющих соответствующих системных вызовов) была добавлена в glibc 2.1.
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008.
ЗАМЕЧАНИЯ
Системные вызовы pread() и pwrite() особенно полезны в многонитиевых
приложениях. Они позволяют нескольким нитям выполнять ввод-вывод в один
файловый дескриптор не учитывая изменений файлового смещения, сделанного
другими нитями.
Отличия между библиотекой C и ядром
В Linux нижележащие системные вызовы переименованы в ядре версии 2.6: pread() стал называться pread64(), а pwrite() --- pwrite64(). Номера системных вызовов остались прежними. Обёрточные функции pread() и pwrite() в glibc скрывают данные переименование.На некоторых 32-битных архитектурах интерфейс этих системных вызовов отличается от описанного выше, по причинам указанным в syscall(2).