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

Златоуст.Ru

 

 

GETMSG(2)                                             GETMSG(2)

НАЗВАНИЕ 
        getmsg - извлечение  сообщения из потока, ассоциирован-
        ного с псевдоустройством

СИНТАКСИС 
        #include 

        int getmsg (fd, ctlptr, dataptr, flags)
        int fd;
        struct strbuf *ctlptr;
        struct strbuf *dataptr;
        int *flags;

ОПИСАНИЕ 
        Системный вызов getmsg извлекает сообщение  из  очереди
        чтения  в  истоке потока, ассоциированного с псевдоуст-
        ройством [см. intro(2)], и помещает его в буфера,  ука-
        занные  пользователем. Сообщение может состоять из двух
        частей: области данных и управляющей  области,  которые
        помещаются в разные буфера (см. ниже). Семантика каждой
        части  определяется модулем потока, породившего сообще-
        ние.

        Аргумент fd задает дескриптор файла, ассоциированный  с
        открытым потоком.

        Каждый из аргументов ctlptr и dataptr является указате-
        лем на структуру типа strbuf, содержащую следующие ком-
        поненты:

             int maxlen; /* Максимальная длина буфера */
             int len;    /* Длина извлеченной информации */
             char *buf;  /* Указатель на буфер */

        Компонент buf указывает на буфер, в который должны быть
        помещены данные или управляющая  информация,  а  maxlen
        задает  размер  буфера  в байтах. Возвращаемое значение
        len содержит количество байт данных или управляющей ин-
        формации, которое фактически было помещено в буфер, или
        0, если область данных или  управляющая  область  имеют
        нулевую длину, или -1, если область данных или управля-
        ющая область отсутствуют в данном сообщении.

        Переменной,  на которую указывает аргумент flags, могут
        быть присвоены два значения: 0 или RS_HIPRI (см. ниже).

        Указатель ctlptr используется для извлечения  управляю-
        щей области сообщения, dataptr - для извлечения области
        данных.  Если ctlptr (или dataptr) равны NULL, или ком-
        понент maxlen равен -1, управляющая  область  (или  об-
        ласть данных) не обрабатывается; она остается в очереди
        чтения  истока,  а  len устанавливается равным -1. Если
        компонент maxlen равен 0, а  управляющая  область  (или
        область  данных) содержит ненулевое число байт, они ос-
        таются в очереди чтения истока, а  len  устанавливается
        равным  0.  Если  maxlen меньше, чем размер управляющей
        области (области  данных),  извлекается  только  maxlen
        байт. В этом случае оставшаяся часть остается в очереди
        чтения  истока  и  возвращается ненулевое значение, как
        это описано ниже в пункте ДИАГНОСТИКА. Если  информация
        извлекается из приоритетного сообщения, то  переменная,
        на  которую  указывает аргумент flags, получит значение
        RS_HIPRI.

        По умолчанию системный вызов getmsg извлекает из очере-
        ди чтения в истоке первое сообщение, независимо от  то-
        го,  является  оно  приоритетным или нет. Пользователь,
        однако, может потребовать выдачи  только  приоритетного
        сообщения, установив по адресу flags значение RS_HIPRI.
        В  этом  случае  будет извлечено первое из приоритетных
        сообщений, стоящих в очереди, даже если перед ним нахо-
        дятся несколько неприоритетных.

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

        Если в потоке, из которого извлекается сообщение,  про-
        исходит  освобождение  линии, то системный вызов getmsg
        будет нормально работать, пока очередь чтения в  истоке
        не  станет пустой. После этого getmsg присвоит 0 компо-
        нентам len тех структур, на которые указывают аргументы
        ctlptr и dataptr.

        Системный вызов getmsg завершается неудачей,  если  вы-
        полнено хотя бы одно из следующих условий:

        [EAGAIN]    Установлен  флаг O_NDELAY, а сообщения ука-
                    занного типа в очереди чтения нет.

        [EBADF]     Аргумент fd не является корректным дескрип-
                    тором открытого файла.

        [EBADMSG]   Сообщение, которое должно читаться, не  яв-
                    ляется корректным для getmsg.

        [EFAULT]    Аргумент  ctlptr, dataptr, или flags указы-
                    вает за пределы отведенного процессу адрес-
                    ного пространства.

        [EINTR]     Во время выполнения системного  вызова  пе-
                    рехвачен сигнал.

        [EINVAL]    Аргумент flags имеет некорректное значение,
                    или поток, на который ссылается  fd,  муль-
                    типлексируется.

        [ENOSTR]    С дескриптором fd не ассоциирован поток.

        Кроме того, системный вызов getmsg  завершается  неуда-
        чей, если, до обращения к getmsg, в истоке потока полу-
        чено  сообщение об ошибке псевдоустройства. В этом слу-
        чае переменной errno присваивается значение, содержаще-
        еся в сообщении.

СМ. ТАКЖЕ 
        intro(2), read(2), poll(2), putmsg(2), write(2).

ДИАГНОСТИКА 
        При успешном  завершении  возвращается  неотрицательное
        целое  значение. Значение 0 означает, что все сообщение
        было успешно прочитано. Значение, равное MORECTL, озна-
        чает, что осталась непрочитанной часть управляющей  об-
        ласти.  Значение,  равное MOREDATA, означает, что оста-
        лась непрочитанной часть области данных. Значение, рав-
        ное MOREDATA | MORECTL, означает, что осталась непрочи-
        танной как часть области данных, так и часть  управляю-
        щей  области.  Последующие вызовы getmsg  позволяют из-
        влечь остаток сообщения.

        В случае ошибки возвращается  -1,  а  переменной  errno
        присваивается код ошибки.



 

 

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

Мое резюме

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

Ресурсы сети

Фотоальбом

 

 

 

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