Программирование на C

Функция чтения POSIX в программировании на C

Функция чтения POSIX в программировании на C
В традиционных операционных системах, совместимых с POSIX, для получения информации из документа, содержащегося в файловой системе, программа использовала системный вызов read. Дескриптор документа, к которому обычно обращаются из предыдущего вызова open, определяется файлом. Этот системный вызов read считывает информацию в байтах и ​​целое число, которое вызывающий указывает из документа, а затем сохраняет ее в буфере, предоставляемом вызывающим механизмом.

Определение функции

Перед определением функции чтения в вашем коде вы должны включить некоторые необходимые пакеты.

#включать

Вот как вы определяете функцию чтения POSIX:

>> ssize_t pread (int fildes, void * buf, size_t nbyte, off_t смещение);
>> ssize_t read (int fd, void * buf, size_t nbytes);

Из вызова метода чтения можно получить три аргумента параметра:

int fd: Файловый дескриптор файла, из которого должна быть прочитана информация. Мы могли бы использовать файловый дескриптор, полученный с помощью открытого системного вызова, или мы могли бы просто использовать 0, 1 или 2, ссылаясь на типичный ввод, обычный вывод или обычную ошибку, соответственно.

Пустота * buf: Буфер или массив символов, в котором следует сохранять и хранить считанные данные.

Size_t nbyte: Количество байтов, которые необходимо было прочитать из документа перед усечением. Вся информация может храниться в буфере, если считываемая информация короче n байтов.

Описание

Метод read () пытается прочитать байтов 'nbyte' в буферный кеш, на который указывает 'buf', либо из файла, связанного с дескриптором открытого документа 'Fildes' или 'fd'. Он не определяет характер нескольких одновременных чтений одного и того же потока, FIFO или оконечного устройства.

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

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

Если количество больше SSIZE_MAX, согласно POSIX.1, то результат определяется реализацией.

Возвращаемое значение

Число байтов read и pread, возвращаемых после достижения, должно быть неотрицательным целым числом, а ноль указывает на конец файла. Позиция документа увеличивается на это число, иначе, чтобы обозначить ошибку, методы возвращают -1 и присваивают 'errno'. Когда это число меньше количества запрошенных байтов, это не ошибочный байт. Возможно, сейчас доступно меньше байтов.

Ошибки

Функции pread и read будут неудачными, если возникнут следующие ошибки:

EAGAIN:

Документ или файловый дескриптор 'fd' принадлежит файлу без сокета, который был помечен как неблокирующий (O NONBLOCK) и будет блокировать чтение.

EWOULDBLOCK:

Дескриптор 'fd' принадлежит сокету, который был помечен как неблокирующий (O_NONBLOCK) и будет блокировать чтение.

EBADF:

'Fd' может быть непригодным для использования дескриптором или не может быть открыт для чтения.

EFAULT:

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

EINTR:

До считывания информационных данных звонок мог прерваться сигналом.

EINVAL:

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

EINVAL:

Дескриптор 'fd' мог быть сформирован с помощью вызова timerfd_create (2), и для чтения был предоставлен буфер неправильного размера.

EIO:

Это ошибка ввода / вывода. Это происходит, когда группа фоновых процессов пытается прочитать со своего регулирующего терминала, и тот или иной пропускает или блокирует SIGTTIN, или его группа процессов теряется. Другой причиной этой ошибки может быть низкоуровневая ошибка ввода / вывода при чтении с жесткого диска или ленты. Другой потенциальной причиной EIO в сетевых файлах данных является снятие рекомендательной блокировки файлового дескриптора и отказ этой блокировки.

EISDIR:

Дескриптор файла 'fd' принадлежит каталогу.

Заметки:

Также могут возникать многие другие ошибки, зависящие от объекта, связанного с дескриптором 'fd'. Обе формы size_t и ssize_t являются немаркированными и отмеченными числовыми типами данных, определенными POSIX.1. В Linux можно передать не более 0x7ffff000 (2 147 479 552) байта с помощью функции чтения (и эквивалентных системных вызовов), возвращающей количество первоначально переданных байтов (как на 32-разрядных, так и на 64-разрядных платформах). В файловых системах NFS только в первый момент, когда метка времени изменяется путем чтения крошечных потоков информации, последующие вызовы этого не сделают. Он запускается кэшированием атрибутов на стороне клиента, поскольку, хотя и не все, клиенты NFS прекращают обновление на сервере через st_atime (время последнего доступа к файлу), а чтение на стороне клиента, выполненное из буфера клиента, не вызывает изменений в st- время на сервере, так как показания на стороне сервера недоступны. Удалив кеширование атрибутов на стороне клиента, можно получить доступ к метаданным UNIX, но это значительно увеличит нагрузку на сервер и в большинстве случаев повлияет на производительность.

Пример 01:

Вот программа на C для демонстрации вызова функции чтения в системе Linux. Напишите команду ниже, как в новом файле. Добавьте библиотеки и в основной функции инициализируйте дескриптор и размер. Дескриптор открывает файл, а размер используется для чтения данных файла.

Результат для приведенного выше кода будет таким, как показано на изображении ниже.

Пример 02:

Другой пример, иллюстрирующий работу функции чтения, приведен ниже.

Создайте еще один файл и запишите приведенный ниже код, как он есть. Вот два дескриптора, fd1 и fd2, у каждого из которых есть доступ к собственному открытому табличному файлу. Итак, для foobar.txt, у каждого дескриптора есть расположение файла. Самый первый байт foobar.txt переведен из fd2, и результат будет c = f, а не c = o.

Заключение

Мы эффективно прочитали функцию чтения POSIX в программировании на C. Надеюсь, сомнений не осталось.

Установите последнюю версию эмулятора Dolphin для Gamecube и Wii в Linux
Эмулятор Dolphin позволяет вам играть в выбранные вами игры Gamecube и Wii на персональных компьютерах (ПК) Linux. Являясь свободно доступным игровым...
Как использовать чит-движок GameConqueror в Linux
В статье содержится руководство по использованию чит-движка GameConqueror в Linux. Многие пользователи, играющие в игры на Windows, часто используют п...
Лучшие эмуляторы игровой консоли для Linux
В этой статье будет перечислено популярное программное обеспечение для эмуляции игровых консолей, доступное для Linux. Эмуляция - это уровень совмести...