mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк 

Златоуст.Ru

 

 

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
        присваивается код ошибки.



 

 

Бернадинер Марк Абрамович

Мое резюме

Компьютерная страничка

Ресурсы сети

Фотоальбом

 

 

 

mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк