READ(2) READ(2)
НАЗВАНИЕ
read - чтение из файла
СИНТАКСИС
int read (fildes, buf, nbyte)
int fildes;
char *buf;
unsigned nbyte;
ОПИСАНИЕ
Аргумент fildes - это дескриптор файла, полученный пос-
ле выполнения системных вызовов creat(2), open(2),
dup(2), fcntl(2) или pipe(2).
Системный вызов read пытается прочитать nbyte байт из
файла, ассоциированного с дескриптором fildes, в буфер,
указателем на который является аргумент buf.
Для устройств, допускающих позиционирование, системный
вызов read выполняет чтение из файла, начиная с указа-
теля текущей позиции, ассоциированного с дескриптором
fildes. После завершения чтения указатель текущей пози-
ции файла увеличивается на количество прочитанных байт.
Для устройств без возможности позиционирования чтение
всегда выполняется с текущей позиции. Значение указате-
ля текущей позиции файла для такого устройства неопре-
делено.
При успешном завершении системного вызова read возвра-
щается количество байт, реально прочитанных и помещен-
ных в буфер; это количество может быть меньше значения
аргумента nbyte, если файл ассоциирован с линией связи
[см. ioctl(2) и termio(7)] или если количество байт,
оставшихся в файле, меньше значения аргумента nbyte.
Если текущая позиция совпадала с концом файла, резуль-
тат будет равен 0.
Чтение с псевдоустройств [см. intro(2)] может выпол-
няться в трех различных режимах: байтном, режиме сооб-
щений без сброса и режиме сообщений со сбросом. Стан-
дартным является байтный режим. С помощью системного
вызова ioctl режим может быть изменен (опция I_SRDOPT
[см. streamio(7)]) и опрошен (опция I_GRDOPT). В байто-
вом режиме системный вызов read выбирает данные из по-
тока до тех пор, пока не получит nbyte байт или пока не
выберет все данные потока. В этом режиме границы сооб-
щений игнорируются.
В режиме сообщений без сброса системный вызов read вы-
бирает данные до тех пор, пока не получит nbyte байт
или пока не встретит границу сообщения. Если сообщение
прочитано не полностью, то оставшиеся данные помещаются
в поток и могут быть извлечены последующими вызовами
read или getmsg(2). В режиме сообщений со сбросом также
выбираются данные до тех пор, пока не будет получено
nbyte байт или пока не встретится граница сообщения;
однако непрочитанные данные, оставшиеся в сообщении по
завершении системного вызова read, теряются, и их нель-
зя получить последующими вызовами read или getmsg.
При попытке чтения из обычного файла с установленным
флагом учета блокировки [см. chmod(2)] и при наличии
блокировки на запись (другим процессом) того сегмента
файла, который должен быть прочитан, в зависимости от
значения флага O_NDELAY системный вызов read ведет себя
следующим образом:
1. Если установлен флаг O_NDELAY, то возвращается
значение -1, а переменной errno присваивается код
ошибки EAGAIN.
2. Если флаг O_NDELAY не установлен, то читающий про-
цесс откладывается до снятия блокировки.
При попытке чтения из пустого канала:
1. Если установлен флаг O_NDELAY, то системный вызов
read возвращает значение 0.
2. Если не установлен флаг O_NDELAY, то читающий про-
цесс откладывается до тех пор, пока данные не бу-
дут записаны в файл, или пока файл не перестанет
быть открытым на запись.
При попытке чтения из файла, ассоциированного с терми-
налом, когда нет данных, предназначенных для чтения:
1. Если установлен флаг O_NDELAY, то возвращается
значение 0.
2. Если не установлен флаг O_NDELAY, то читающий про-
цесс откладывается до тех пор, пока данные не поя-
вятся.
При попытке чтения из файла, ассоциированного с пото-
ком, в котором нет данных:
1. Если установлен флаг O_NDELAY, то возвращается
значение -1, а переменной errno присваивается код
ошибки EAGAIN.
2. Если не установлен флаг O_NDELAY, то читающий про-
цесс откладывается до тех пор, пока данные не поя-
вятся.
При чтении с псевдоустройства реакция на пустое сообще-
ние (то есть сообщение, содержащее 0 байт) определяется
установленным режимом чтения. В байтном режиме систем-
ный вызов read читает байты, пока не получит nbyte
байт, или пока не выберет все данные из потока, или по-
ка не встретит пустое сообщение. Затем read возвращает
количество прочитанных байт и помещает пустое сообщение
назад в поток для последующего извлечения с помощью вы-
зовов read или getmsg. В двух других режимах при извле-
чении пустого сообщения возвращается значение 0 и само
сообщение удаляется из потока. Если пустое сообщение
читается как первое сообщение в потоке, то значение 0
возвращается независимо от режима чтения.
При чтении с псевдоустройств системный вызов read может
обрабатывать только сообщения с данными. Он не в состо-
янии обработать протокольное сообщение и завершается
неудачей, если встретит подобное сообщение в истоке по-
тока.
Если в потоке происходит освобождение линии, то систем-
ный вызов read будет нормально работать, пока очередь
чтения в истоке не станет пустой. После этого read вер-
нет значение 0.
Системный вызов read завершается неудачей, если выпол-
нено хотя бы одно из следующих условий:
[EAGAIN] Установлены флаги учета блокировки файла и
O_NDELAY, и требуемый сегмент файла забло-
кирован.
[EAGAIN] Общее количество системной памяти, предос-
тавленной для бесструктурного ввода/вывода,
временно оказалось недостаточным.
[EAGAIN] При установленном флаге O_NDELAY в потоке
нет сообщений, ожидающих чтения.
[EBADF] Аргумент fildes не является корректным
дескриптором файла, открытого на чтение.
[EBADMSG] Сообщение, считываемое из потока, не явля-
ется сообщением с данными.
[EDEADLK] Попытка ожидания чтения приводит к тупику.
[EFAULT] Аргумент buf указывает за пределы отведен-
ного процессу адресного пространства.
[EINTR] Во время выполнения системного вызова пе-
рехвачен сигнал.
[EINVAL] Попытка чтения из потока, который мультип-
лексируется.
[ENOLCK] Нет свободного места в системной таблице
блокировок.
[ENOLINK] Аргумент fildes является дескриптором файла
на удаленном компьютере, связи с которым в
данный момент нет.
Чтение с псевдоустройства также завершается неудачей,
если в истоке потока получено сообщение об ошибке. В
этом случае переменной errno присваивается значение,
содержащееся в сообщении.
СМ. ТАКЖЕ
creat(2), dup(2), fcntl(2), ioctl(2), intro(2),
open(2), pipe(2), getmsg(2).
streamio(7), termio(7) в Справочнике администратора.
ДИАГНОСТИКА
При успешном завершении результат равен неотрицательно-
му целому числу - количеству реально прочитанных байт;
в случае ошибки возвращается -1, а переменной errno
присваивается код ошибки.
|