Назва

read - читає з файлового дескриптору

Огляд

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

Опис

Функція read() намагається прочитати до count байтів файлового дескриптору fd у буфер, починаючи з buf.

Якщо count дорівнює нулеві, read() повертає нуль і жодної дії не відбудеться. Якщо count більший за SSIZE_MAX, результат є невизначеним.

Повернені значення

При вдалім виконанні повертається число прочитаний байтів (нуль вказує на кінець файлу), і позиція файлу переміститься на дане число. Не вважається помилкою, якщо число переміщення виявиться меншим за кількість вказаних байтів; це може статися, наприклад, якщо на даний момент доступні менша кількість байтів (можливо того, що ми знаходимся близько до кінця файлу, або читаємо з конвеєру або терміналу), або read() було перервано сигналом. При помилці, повертається -1 і змінна errno отримає відповідне значення. В цьому випадку не зазначено, чи позиція файлу (якщо встановлено) змінюється, чи ні.

Коди помилок

EINTR : Виклик перервано сигналом до того, як прочитати якісь дані.

EAGAIN : Було вибрано не-блокуючий режим читання/запису за допомогою O_NOBLOCK, і жодних даних не було в негайній наявності для читання.

EIO : Помилка вводу/виводу. Це може статися, наприклад, коли процес знаходиться в групі процесів фонового режиму, намагається прочитати зі своєго контролюючого tty (терміналу), i або він ігнорує чи блокує SIGTTIN, або група, до якої він належить, зависла (осиротіла). Також це може бути через низькорівневої помилки вводу/виводу під час зчитування з диску чи стрічки.

EISDIR : fd стосується каталогу.

EBADF : fd не є чинним дескриптором файлу, або не відкрито для читання.

EINVAL : fd приєднано до об'єкту, непридатного для читання.

EFAULT : buf знаходиться поза межами досяжного адресного простору.

Можливі також інші помилки, в залежності до об'єкту, приєднаного до fd. POSIX дозволяє, щоб read, перерваний після прочитання якоїсь кількості даних, повертав -1 (із errno встановленим до EINTR) або кількість вже прочитаних байтів.

Відповідність стандартам

SVr4, SVID, AT&T, POSIX, X/OPEN, BSD 4.3

Обмеження

На файлових системах NFS, читання малої кількості даних оновить тільки перший раз мітку часу, наступні виклики можуть не здійснювати цього. Це пов'язано із кешуванням атрибутів на клієнтському боці, так як більшість, якщо не всі, клієнти NFS залишають поновлення atime серверу і клієнтська сторона, спокійно читаючи з власного кешу, не вимагатиме поновлення atime на сервері за відсутністю читання на серверному боці. UNIX-семантики можна добитись через заборону кешування атрибутів на клієнтській стороні, але це, в більшості випадків, значно збільшить навантаження серверу і погіршить ефективність.

Багато файлових систем і дисків вважаються настільки швидкими, що втілення O_NONBLOCK вважається непотрібним. Тож O_NONBLOCK може бути відсутньою для файлів і/або дисків.

Дивіться також

close(2), ?fcntl(2), ioctl(2), ?lseek(2), ?readdir(2), ?readlink(2), select(2), write(2), ?fread(3), ?readv(3)