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