mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк 

Златоуст.Ru

 

 

MSGOP(2)                                               MSGOP(2)

НАЗВАНИЕ 
        msgop - операции над очередью сообщений

СИНТАКСИС 
        #include 
        #include 
        #include 

        int msgsnd (msqid, msgp, msgsz, msgflg)
        int msqid;
        struct msgbuf *msgp;
        int msgsz, msgflg;

        int msgrcv (msqid, msgp, msgsz, msgtyp, msgflg)
        int msqid;
        struct msgbuf *msgp;
        long msgtyp;
        int msgsz, msgflg;

ОПИСАНИЕ 
     Посылка сообщения 
        Системный вызов msgsnd используется для того, чтобы по-
        местить сообщение в очередь, ассоциированную с  иденти-
        фикатором очереди msqid. {Требуется право  на  запись.}
        Аргумент msgp является указателем на структуру,  содер-
        жащую сообщение. Структура содержит следующие поля:

             long mtype;     /* Тип сообщения */
             char mtext [];  /* Текст сообщения */

        Поле mtype содержит положительное целое число,  которое
        может использоваться процессом-получателем  для  выбора
        сообщений (см. ниже описание системного вызова msgrcv).
        Поле mtext содержит текст длиной msgsz  байт.  Аргумент
        msgsz может принимать значения от 0  до  установленного
        системой лимита.

        Аргумент  msgflg  специфицирует действия, предпринимае-
        мые, если выполнено хотя бы одно из следующих условий:

        1.   Текущее количество байт в очереди уже равно значе-
             нию поля msg_qbytes ассоциированной структуры дан-
             ных [см. intro(2)].

        2.   Общее количество сообщений во всех очередях систе-
             мы равно максимально допустимому системой.

        Действия, специфицируемые аргументом msgflg, следующие:

        1.   Если выражение (msgflg & IPC_NOWAIT)  истинно,  то
             сообщение не  посылается  и  вызывающему  процессу
             сразу же возвращается управление.

        2.   Если выражение (msgflg & IPC_NOWAIT) ложно, то вы-
             полнение вызывающего процесса задерживается до тех
             пор, пока не произойдет одно из следующих событий:

             2.1. Условие, определяющее задержку процесса,  пе-
                  рестает существовать; в этом случае посылает-
                  ся сообщение.

             2.2. Идентификатор очереди сообщений msqid  удаля-
                  ется из системы [см. msgctl(2)]; в этом  слу-
                  чае errno присваивается значение  EIDRM  и  в
                  качестве результата возвращается -1.

             2.3. Вызывающий процесс получает  сигнал,  который
                  должен быть обработан; в этом случае  сообще-
                  ние не посылается и вызывающий  процесс  про-
                  должает  выполнение  так,   как   описано   в
                  signal(2).

        Системный вызов msgsnd завершается неудачей и сообщение
        не посылается, если выполнено хотя бы одно из следующих
        условий:

        [EINVAL]    Идентификатор очереди  сообщений  msqid  не
                    является корректным.

        [EACCES]    У вызывающего процесса нет прав на выполне-
                    ние операции [см. intro(2)].

        [EINVAL]    Значение поля mtype меньше 1.

        [EAGAIN]    Сообщение не может быть послано  по  какой 
                    либо из описанных выше причин, и  выражение
                    (msgflg & IPC_NOWAIT) истинно.

        [EINVAL]    Значение аргумента msgsz меньше 0 или боль-
                    ше максимально допустимого в системе.

        [EFAULT]    Аргумент msgp указывает за пределы отведен-
                    ного процессу адресного пространства.

        При успешном выполнении вызова над  структурой  данных,
        ассоциированной с идентификатором  msqid,  производятся
        следующие действия [см. intro(2)]:

        1.   Значение поля msg_qnum увеличивается на 1.

        2.   Значение  поля  msg_lspid  устанавливается  равным
             идентификатору (номеру) вызывающего процесса.

        3.   Значение поля msg_stime устанавливается равным те-
             кущему времени.

     Прием сообщения 
        Системный вызов msgrcv получает сообщение  из  очереди,
        ассоциированной с идентификатором очереди msqid, и  по-
        мещает его в структуру, на которую  указывает  аргумент
        msgp. {Требуется право на чтение.} Эта структура состо-
        ит из следующих полей:

             long mtype;    /* Тип сообщения */
             char mtext []; /* Текст сообщения */

        Поле  mtype содержит тип получаемого сообщения, который
        специфицируется посылающим процессом. Поле mtext содер-
        жит текст сообщения. Значение аргумента msgsz определя-
        ет размер текста в байтах. Получаемое сообщение обреза-
        ется до msgsz байт, если его длина  превышает  msgsz  и
        выражение  (msgflg  & MSG_NOERROR) истинно. Отброшенная
        часть сообщения пропадает и вызывающий процесс не полу-
        чает никакого уведомления об обрезании.

        Аргумент msgtyp специфицирует тип запрашиваемого  сооб-
        щения в соответствии со следующими соглашениями:

        1.   Если значение msgtyp равно 0, требуется первое со-
             общение в очереди.

        2.   Если значение msgtyp больше  0,  требуется  первое
             сообщение типа msgtyp.

        3.   Если значение msgtyp меньше  0,  требуется  первое
             сообщение наименьшего из типов, которые меньше или
             равны абсолютной величине аргумента msgtyp.

        Аргумент msgflg специфицирует действия, предпринимаемые
        в том случае, если в очереди нет сообщения нужного  ти-
        па. Эти действия следующие:

        1.   Если выражение (msgflg & IPC_NOWAIT)  истинно,  то
             вызывающий процесс сразу же  получает  управление,
             ему возвращается -1 и errno присваивается значение
             ENOMSG.

        2.   Если выражение (msgflg & IPC_NOWAIT) ложно, то вы-
             полнение вызывающего  процесса  приостанавливается
             до тех пор, пока не произойдет одно  из  следующих
             событий:

             2.1. В очереди появляется сообщение нужного типа.

             2.2. Идентификатор очереди сообщений удаляется  из
                  системы; в  этом  случае  возвращается  -1  и
                  errno присваивается значение EIDRM.

             2.3. Вызывающий процесс получает  сигнал,  который
                  должен быть обработан; в этом случае  получе-
                  ния сообщения не происходит и вызывающий про-
                  цесс возобновляет выполнение так, как описано
                  в signal(2).

        Системный вызов msgrcv завершается неудачей и сообщение
        не принимается, если выполнено хотя бы одно из  следую-
        щих условий:

        [EINVAL]    Значение аргумента msgid не  является  кор-
                    ректным идентификатором очереди сообщений.

        [EACCES]    У вызывающего процесса нет прав на выполне-
                    ние операции.

        [EINVAL]    Значение аргумента msgsz меньше 0.

        [E2BIG]     Размер сообщения больше msgsz  и  выражение
                    (msgflg & MSG_NOERROR) ложно.

        [ENOMSG]    Очередь не содержит сообщения нужного  типа
                    и выражение (msgflg & IPC_NOWAIT) истинно.

        [EFAULT]    Аргумент msgp указывает за пределы отведен-
                    ного процессу адресного пространства.

        При успешном выполнении вызова над  структурой  данных,
        ассоциированной с идентификатором  msqid,  производятся
        следующие действия [см. intro(2)]:

        1.   Значение поля msg_qnum уменьшается на 1.

        2.   Значение  поля  msg_lrpid  устанавливается  равным
             идентификатору (номеру) вызывающего процесса.

        3.   Значение поля msg_rtime устанавливается равным те-
             кущему времени.

СМ. ТАКЖЕ 
        intro(2), msgctl(2), msget(2), signal(2).

ДИАГНОСТИКА 
        Если описанные выше системные вызовы завершаются неуда-
        чей из-за получения сигнала,  то  вызывающему  процессу
        возвращается -1, а переменной errno присваивается  зна-
        чение EINTR. Если системные вызовы завершаются неудачей
        из-за удаления из системы идентификатора очереди msqid,
        то  возвращается  -1  и  errno  присваивается  значение
        EIDRM.

        При успешном завершении системных вызовов  возвращаются
        следующие значения:

        1.   Msgsnd  возвращает 0.

        2.   Msgrcv  возвращает  значение,  равное   количеству
             байт, действительно помещенных в поле mtext.

        В иных случаях  возвращается  -1,  а  переменной  errno
        присваивается код ошибки.



 

 

Бернадинер Марк Абрамович

Мое резюме

Компьютерная страничка

Ресурсы сети

Фотоальбом

 

 

 

mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк