Системный вызов read linux

Системный вызов read linux

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

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

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

При успешном завершении вызова возвращается количество байтов, которые были считаны (нулевое значение означает конец файла), а позиция файла увеличивается на это значение. Если количество прочитанных байтов меньше, чем количество запрошенных, то это не считается ошибкой: например, данные могли быть почти в конце файла, в канале, на терминале, или read () был прерван сигналом. В случае ошибки возвращаемое значение равно -1, а переменной errno присваивается номер ошибки. В этом случае позиция файла не определена.

НАЙДЕННЫЕ ОШИБКИ

EINTR Системный вызов был прерван сигналом до того, как был прочитан хотя бы один байт. EAGAIN При помощи O_NONBLOCK был выбран неблокирующий (non-blocking) ввод-вывод, и нет данных, доступных для чтения в данный момент. EIO Ошибка ввода-вывода. Это может произойти, например, если процесс, находящийся в группе фоновых процессов, пытается читать данные на контрольном терминале, игнорирует или блокирует сигнал SIGTTIN , или же его группа осталась без родителя. Это может также случиться, если произошла низкоуровневая ошибка ввода-вывода при считывании данных с диска или ленты. EISDIR fd указывает на каталог. EBADF fd является неверным файловым описателем или не открыт для чтения. EINVAL fd связан с объектом, не предназначенным для чтения. EFAULT buf указывает на каталог за пределами доступного адресного пространства.

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

СООТВЕТСТВИЕ СТАНДАРТАМ


НАЙДЕННЫЕ ОШИБКИ И ОГРАНИЧЕНИЯ

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

Читайте также:  1с linux печать ошибка внешней компоненты

Много файловых систем и дисков создавались достаточно быстрыми для того, чтобы в использовании O_NONBLOCK не было необходимости. Поэтому иногда O_NONBLOCK может быть недоступно на некоторых файлах и/или дисках.

Источник

Системный вызов read linux

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

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

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

При успешном завершении вызова возвращается количество байтов, которые были считаны (нулевое значение означает конец файла), а позиция файла увеличивается на это значение. Если количество прочитанных байтов меньше, чем количество запрошенных, то это не считается ошибкой: например, данные могли быть почти в конце файла, в канале, на терминале, или read () был прерван сигналом. В случае ошибки возвращаемое значение равно -1, а переменной errno присваивается номер ошибки. В этом случае позиция файла не определена.

НАЙДЕННЫЕ ОШИБКИ

EINTR Системный вызов был прерван сигналом до того, как был прочитан хотя бы один байт. EAGAIN При помощи O_NONBLOCK был выбран неблокирующий (non-blocking) ввод-вывод, и нет данных, доступных для чтения в данный момент. EIO Ошибка ввода-вывода. Это может произойти, например, если процесс, находящийся в группе фоновых процессов, пытается читать данные на контрольном терминале, игнорирует или блокирует сигнал SIGTTIN , или же его группа осталась без родителя. Это может также случиться, если произошла низкоуровневая ошибка ввода-вывода при считывании данных с диска или ленты. EISDIR fd указывает на каталог. EBADF fd является неверным файловым описателем или не открыт для чтения. EINVAL fd связан с объектом, не предназначенным для чтения. EFAULT buf указывает на каталог за пределами доступного адресного пространства.

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

СООТВЕТСТВИЕ СТАНДАРТАМ


НАЙДЕННЫЕ ОШИБКИ И ОГРАНИЧЕНИЯ

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

Читайте также:  Установить пароль рут линукс

Много файловых систем и дисков создавались достаточно быстрыми для того, чтобы в использовании O_NONBLOCK не было необходимости. Поэтому иногда O_NONBLOCK может быть недоступно на некоторых файлах и/или дисках.

Источник

Системный вызов read linux

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

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

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

ОШИБКИ

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 или же его группа процессов осталась без родителя. Это также может случиться, если произошла низкоуровневая ошибка ввода-вывода при чтения с диска или ленты. EISDIR fd указывает на каталог. Могут также возникнуть другие ошибки, в зависимости от объекта, связанного с fd. POSIX позволяет системному вызову read(), который был прерван после чтения первого куска запрошенных данных, возвращать -1 (с errno, установленной в EINTR) или количество уже прочитанных байт.

Читайте также:  Windows remote desktop connection in linux

СООТВЕТСТВИЕ СТАНДАРТАМ

ЗАМЕЧАНИЯ

В 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: … Среди перечисленных в программном интерфейсе есть read() и readv(2). И среди действий, которые должны выполняться атомарно между нитями (и процессами), если обновление файлового смещения. Однако в Linux до версии 3.14 это было не так: если два процесса с общим открытым файловым описанием (смотрите open(2)) выполняют read() (или readv(2)) одновременно, то операции ввода-вывода не атомарны при обновлении файлового смещения; в результате прочитанные двумя процессами блоки данных могут (некорректно) перекрываться. Эта ошибка исправлена в Linux 3.14.

Источник

Оцените статью
Adblock
detector