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