Руководство программиста для Linux


Очереди сообщений - часть 4


NOTES:

Первый аргумент msgget() значение ключа (мы его получаем при помощи ftok()). Этот ключ сравнивается с ключами уже существующих в ядре очередей. При этом операция открытия или доступа к очереди зависит от содержимого аргумента msgflg:

IPC_CREAT

Создает очередь, если она не была создана ранее.

IPC_EXCL

При использовании совместно с IPC_CREAT, приводит к неудаче если очередь уже существует.

Вызов msgget() с IPC_CREAT, но без IPC_EXCL всегда выдает идентификатор (существующей с таким ключом или созданной) очереди. Использование IPC_EXCL вместе с IPC_CREAT либо создает новую очередь, либо, если очередь уже существует, заканчивается неудачей. Самостоятельно IPC_EXCL бесполезен, но вместе c IPC_CREAT он дает гарантию, что ни одна из существующих очередей не открывается для доступа.

Восьмеричный режим может быть OR-нут в маску доступа. Каждый IPC-объект имеет права доступа, аналогичные правам доступа к файлу в файловой системе UNIX-а.

Напишем оберточную функцию для открытия или создания очереди сообщений. int open_queue( key_t keyval ) { int qid; if ((qid = msgget ( keyval, IPC_CREAT | 0660 )) == -1) { return (-1); } return (qid); }

Отметьте использование точного ограничителя доступа 0660. Эта небольшая функция возвращает идентификатор очереди (int) или -1 в случае ошибки. Единственный требуемый аргумент - ключевое значение.

Системный вызов msgsnd()

Получив идентификатор очереди, мы можем выполнять над ней различные действия. Чтобы поставить сообщение в очередь, используйте системный вызов msgsnd(): SYSTEM CALL: msgsnd(); PROTOTYPE: int msgsnd( int msqid, struct msgbuf *msgp, int msgsz, int msgflg ); RETURNS: 0 в случае успеха -1 в случае ошибки: errno = EAGAIN (очередь переполнена, и установлен IPC_NOWAIT) EACCES (доступ отклонен, нет разрешения на запись) EFAULT (адрес msgp недоступен, неверно...) EIDRM (очередь сообщений удалена) EINTR (получен сигнал во время ожидания печати) EINVAL (ошибочный идентификатор очереди сообщений, неположительный тип сообщения или неправильный размер сообщения) ENOMEM (не хватает памяти для копии буфера сообщения) NOTES:




Начало  Назад  Вперед



Книжный магазин