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 читает байты, пока не получит nby te байт, или пока не выберет все данные из потока, или пока не встретит пустое сообщение. Затем 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 присваивается код ошибки.