Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

GETMSG(2)

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

СИНТАКСИС


        #include <stropts.h>



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

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в России, Европе и США

Бесплатная поддержка и администрирование

Оплата российскими и международными картами

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...