Provided by: manpages-ru-dev_4.19.0-7_all bug

ИМЯ

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

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <unistd.h>

       ssize_t read(int fd, void buf[.count], size_t count);

ОПИСАНИЕ

       Вызов  read()  пытается  прочитать  count  байт  из  файлового  дескриптора  fd  в  буфер,
       начинающийся по адресу buf.

       Для файлов, поддерживающих смещения, операция чтения начинается с  файлового  смещения,  и
       файловое  смещение  увеличивается  на  количество прочитанных байт. Если файловое смещение
       находится за концом файла, то ничего не читается и read() возвращает ноль.

       Если значение count равно 0, то read()  может  обнаружить  ошибки,  описанные  далее.  При
       отсутствии  ошибок,  или  если  read()  не  выполняет проверки, то read() с count равным 0
       возвращает 0 и ничего не меняет.

       В соответствие с POSIX.1, если count больше SSIZE_MAX, то результат зависит от реализации;
       смотрите ЗАМЕЧАНИЯ по верхнему пределу в Linux.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При  успешном  выполнении  возвращается  количество  прочитанных байт (ноль означает конец
       файла), а позиция в файле увеличивается на это значение. Если количество прочитанных  байт
       меньше,  чем  количество  запрошенных,  то  это  не считается ошибкой: например, это могло
       произойти из-за того, что прямо сейчас доступно меньшее количество байт (может быть  из-за
       того,  что  позиция  ближе  к концу файла, или потому что выполняется чтение из канала или
       терминала), или потому что работа read() была прервана сигналом. См. также ЗАМЕЧАНИЯ.

       On error, -1 is returned, and errno is set to indicate the error.  In  this  case,  it  is
       left unspecified whether the file position (if any) changes.

ОШИБКИ

       EAGAIN Файловый  дескриптор  fd  указывает на файл, не являющийся сокетом и помеченный как
              неблокирующий ввод/вывод (O_NONBLOCK), а чтение вызовет блокировку. См. open(2) для
              дальнейшей информации по флагу O_NONBLOCK.

       EAGAIN или EWOULDBLOCK
              Файловый   дескриптор  fd  указывает  на  сокет  и  он  помечен  как  неблокирующий
              (O_NONBLOCK), а чтение вызвало бы блокировку. POSIX.1-2001 позволяет вернуть  любую
              ошибку  в  этом случае и не требует, чтобы эти константы имели одинаковое значение,
              поэтому переносимое приложение должно проверять обе эти возможности.

       EBADF  fd не является допустимым файловым дескриптором или не открыт на чтение.

       EFAULT buf находится за пределами доступного вам адресного пространства.

       EINTR  Вызов был прерван сигналом до того как были прочитаны данные; см. signal(7).

       EINVAL fd присоединён к объекту, который не подходит для чтения; или  файл  был  открыт  с
              указанием флага O_DIRECT, или неправильно выравнены адрес в buf, значение count или
              файловое смещение.

       EINVAL fd был создан вызовом timerfd_create(2), а в read()  был  передан  неверный  размер
              буфера; подробней см. в timerfd_create(2).

       EIO    Ошибка  ввода/вывода. Например, это происходит когда процесс, находящийся в фоновой
              группе процессов, пытается выполнить чтение из  своего  управляющего  терминала,  и
              игнорирует  или  блокирует сигнал SIGTTIN, или же его группа процессов осталась без
              родителя.  Это  также  может  случиться,  если  произошла   низкоуровневая   ошибка
              ввода-вывода  при  чтении  с  диска  или ленты. Также EIO может возникать у сетевых
              файловых систем, когда консультативная блокировка была убрана у дескриптора файла и
              потеряна. Подробности смотрите в абзаце Потерянные блокировки в fcntl(2).

       EISDIR fd указывает на каталог.

       В зависимости от объекта, на который указывает fd, могут происходить и другие ошибки.

СТАНДАРТЫ

       SVr4, 4.3BSD, POSIX.1-2001.

ЗАМЕЧАНИЯ

       Типы  данных  size_t  и ssize_t представляют собой, соответственно, беззнаковый и знаковый
       целочисленный тип, определены в POSIX.1.

       В Linux read() (и похожие системные вызовы) передаст не больше 0x7ffff000 (2 147 479  552)
       байт,  возвращая  число  байт, переданных на самом деле (это утверждение справедливо как к
       32-битным, так и к 64-битным системам).

       На файловых системах NFS чтение небольших порций данных обновляет отметки времени только в
       первый  раз,  последующие  вызовы  не  делают  этого. Это вызвано кэшированием атрибутов с
       клиентской стороны, потому что  большинство  (если  не  все)  клиентов  NFS  предоставляют
       серверу  обновлять  st_atime  (время  последнего  доступа),  а  запросы на чтение, которые
       удовлетворяются из клиентского кэша, не вызывают обновления st_atime, потому что данные не
       читаются с сервера. Семантика UNIX может быть достигнута запретом кэширования атрибутов на
       стороне клиента, но в большинстве  случаев  это  увеличит  нагрузку  на  сервер  и  снизит
       производительность.

ДЕФЕКТЫ

       В  соответствие  с  POSIX.1-2008/SUSv4 раздел XSI 2.9.7 ("Thread Interactions with Regular
       File Operations"):

           Следующие функции должны  выполняться  атомарно  по  отношению  друг  к  другу,  чтобы
           работать   с   обычными  файлами  или  символическими  ссылками  так,  как  указано  в
           POSIX.1-2008: …

       Among the APIs subsequently listed are read()  and readv(2).  And among the  effects  that
       should be atomic across threads (and processes)  are updates of the file offset.  However,
       before Linux 3.14, this was not the case:  if  two  processes  that  share  an  open  file
       description  (see open(2)) perform a read()  (or readv(2))  at the same time, then the I/O
       operations were not atomic with respect updating the file offset, with the result that the
       reads  in  the  two  processes might (incorrectly) overlap in the blocks of data that they
       obtained.  This problem was fixed in Linux 3.14.

СМ. ТАКЖЕ

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

ПЕРЕВОД

       Русский  перевод  этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Azamat
       Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Katrin Kutepova
       <blackkatelv@gmail.com>,  Lockal <lockalsash@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>,
       Баринов Владимир и Иван Павлов <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.