Операционная система UNIX. Руководство программиста


Использование msgget - часть 2


/p>

Значение аргумента msgflg в целом является, следовательно, результатом побитного ИЛИ (операция | в языке C) прав на выполнение операций и флагов, например:

msqid = msgget (key, (IPC_CREAT | 0644)); msqid = msgget (key, (IPC_CREAT | IPC_EXCL | 0400));

Как уже указывалось, системный вызов вида

msqid = msgget (IPC_PRIVATE, msgflg);

приведет к попытке выделения нового идентификатора очереди сообщений и ассоциированной информации независимо от значения аргумента msgflg. Попытка может быть неудачной только из-за превышения системного лимита на общее число очередей сообщений, задаваемого настраиваемым параметром MSGMNI [см. master(4)].

При использовании флага IPC_EXCL в сочетании с IPC_CREAT системный вызов msgget(2) завершается неудачей в том и только в том случае, когда с указанным ключом key уже ассоциирован идентификатор. Флаг IPC_EXCL необходим, чтобы предотвратить ситуацию, когда процесс полагает, что получил новый (уникальный) идентификатор очереди сообщений, в то время как это не так. Иными словами, когда используются и IPC_CREAT и IPC_EXCL, при успешном завершении системного вызова обязательно возвращается новый идентификатор msqid.

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




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



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