|
GETMSG(2)НАЗВАНИЕ СИНТАКСИС #include <stropts.h> int getmsg (fd, ctlptr, dataptr, flags) int fd; struct strbuf *ctlptr; struct strbuf *dataptr; int *flags; ОПИСАНИЕ Аргумент 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 завершается неудачей, если выполнено хотя бы одно из следующих условий:
Кроме того, системный вызов getmsg завершается неудачей, если, до обращения к getmsg, в истоке потока получено сообщение об ошибке псевдоустройства. В этом случае переменной errno присваивается значение, содержащееся в сообщении. СМ. ТАКЖЕ ДИАГНОСТИКА В случае ошибки возвращается -1, а переменной errno присваивается код ошибки. |
|