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