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