PUTMSG(2) PUTMSG(2)
НАЗВАНИЕ
putmsg - посылка сообщения в поток, ассоциированный с
псевдоустройством
СИНТАКСИС
#include
int putmsg (fd, ctlptr, dataptr, flags)
int fd;
struct strbuf *ctlptr;
struct strbuf *dataptr;
int flags;
ОПИСАНИЕ
Системный вызов putmsg создает сообщение [см. intro(2)]
по содержимому буферов, указанных пользователем, и по-
сылает сообщение в поток. Сообщение может состоять из
двух частей: области данных и управляющей области, ко-
торые берутся из разных буферов (см. ниже). Семантика
каждой части определяется модулем потока, который полу-
чает это сообщение.
Аргумент fd задает дескриптор файла, ассоциированный с
открытым потоком.
Аргументы ctlptr и dataptr - это указатели на структуру
типа strbuf, содержащую следующие элементы:
int maxlen; /* Максимальная длина буфера */
int len; /* Длина извлеченной информации */
char *buf; /* Указатель на буфер */
Аргумент ctlptr указывает на структуру, описывающую уп-
равляющую область сообщения, если таковая имеется. Ком-
понент buf указывает на буфер, в котором размещается
управляющая информация, а len задает количество байт,
которое должно быть послано. Поле maxlen в системном
вызове putmsg не используется [см. getmsg(2)]. Таким же
образом dataptr задает область данных, если таковая
имеется, которые должны быть включены в сообщение.
Аргумент flags может принимать два значения: 0 или
RS_HIPRI (см. ниже).
Чтобы послать данные в сообщении, аргумент dataptr дол-
жен быть отличен от NULL, а значение компонента len
должно быть неотрицательным. Чтобы послать управляющую
информацию, соответствующие значения должны быть уста-
новлены для ctlptr. Область данных (управляющая об-
ласть) не будет послана, если аргумент dataptr (ctlptr)
равен NULL, или значение компонента len для dataptr
(ctlptr) равно -1.
Если задана управляющая область и значение переменной,
на которую указывает аргумент flags, равно RS_HIPRI,
посылается приоритетное сообщение. Если значение по ад-
ресу flags равно 0, посылается неприоритетное сообще-
ние. Если не указана управляющая область и значение по
адресу flags равно RS_HIPRI, системный вызов putmsg за-
вершается неудачей, а переменная errno получает значе-
ние EINVAL. Если не указана ни управляющая область ни
область данных и значение по адресу flags равно 0, со-
общение не посылается и возвращается нулевой результат.
В случае посылки неприоритетных сообщений процесс, выз-
вавший putmsg, откладывается, если очередь потока на
запись полна вследствие внутренних условий прохождения
сообщений. Для приоритетных сообщений откладывания по
этой причине не происходит. Для неприоритетных сообще-
ний откладывания также не происходит, если очередь по-
тока на запись полна, но установлен флаг O_NDELAY; сис-
темный вызов завершается неудачей, присваивая errno
значение EAGAIN.
Кроме того процесс, вызвавший putmsg, откладывается,
ожидая доступности достаточного числа блоков для сооб-
щений в потоке (независимо от приоритетности и флага
O_NDELAY), если при этом вызов не будет отвергнут из-за
недостатка системных ресурсов. Сообщения по частям не
посылаются.
Системный вызов putmsg завершается неудачей, если вы-
полнено хотя бы одно из следующих условий:
[EAGAIN] Указано неприоритетное сообщение, установ-
лен флаг O_NDELAY, а очередь потока на за-
пись заполнена вследствие внутренних усло-
вий прохождения сообщений.
[EAGAIN] Не удалось выделить буфера для посылаемого
сообщения.
[EBADF] Аргумент fd не является корректным дескрип-
тором файла, открытого на запись.
[EFAULT] Аргумент ctlptr, dataptr, или flags указы-
вает за пределы отведенного процессу адрес-
ного пространства.
[EINTR] Во время выполнения системного вызова пе-
рехвачен сигнал.
[EINVAL] Аргумент flags имеет некорректное значение,
или задано значение RS_HIPRI, а управляющая
область не указана.
[EINVAL] Поток, на который ссылается fd, мультиплек-
сируется.
[ENOSTR] С дескриптором fd не ассоциирован поток.
[ENXIO] Ниже по потоку произошло освобождение ли-
нии.
[ERANGE] Размер области данных сообщения не попадает
в интервал между минимальной и максимальной
длинами пакета, заданными самым верхним мо-
дулем потока. Это значение также возвраща-
ется, если управляющая область или область
данных имеют длины, превосходящие соот-
ветствующие максимумы, заданные при генера-
ции системы.
Кроме того, системный вызов putmsg завершается неуда-
чей, если, до обращения к putmsg, в истоке потока полу-
чено сообщение об ошибке псевдоустройства. В этом слу-
чае переменной errno присваивается значение, содержаще-
еся в сообщении.
СМ. ТАКЖЕ
intro(2), read(2), getmsg(2), poll(2), write(2).
ДИАГНОСТИКА
При успешном завершении результат равен 0; в случае
ошибки возвращается -1, а переменной errno присваивает-
ся код ошибки.
|