| |
        #include <sys/types.h>
        #include <sys/ipc.h>
        #include <sys/msg.h>
        int msgget (key, msgflg)
        key_t key;
        int msgflg;
Тип  key_t  описан во включаемом файле <sys/types.h> при помощи
typedef как целый тип.
Целочисленное значение, возвращаемое в случае успешного завершения системного вызова, есть идентификатор очереди сообщений (msqid). В случае неудачи результат равен -1.
Новый идентификатор msqid, очередь сообщений и ассоциированная с ней структура данных выделяются в каждом из двух случаев:
Права на выполнение операций есть права на чтение из очереди и запись в нее (то есть на прием / посылку сообщений) для владельца, членов группы и прочих пользователей. В следующей таблице сведены возможные элементарные права и соответствующие им восьмеричные значения:
| Права на операции | Восьмеричное значение | 
| Чтение для владельца | 0400 | 
| Запись для владельца | 0200 | 
| Чтение для группы | 0040 | 
| Запись для группы | 0020 | 
| Чтение для остальных | 0004 | 
| Запись для остальных | 0002 | 
В каждом конкретном случае нужная комбинация прав задается как результат побитного ИЛИ значений, соответствующих элементарным правам. Так, правам на чтение / запись для владельца и на чтение для членов группы и прочих пользователей соответствует восьмеричное число 0644. Отметим полную аналогию с правами доступа к файлам.
Флаги  определены  во включаемом файле <sys/ipc.h>. В следующей таблице
сведены мнемонические имена флагов и соответствующие им восьмеричные
значения:
| Флаг | Восьмеричное значение | 
| IPC_CREAT | 0001000 | 
| IPC_EXCL | 0002000 | 
Значение  аргумента msgflg в целом является, следовательно, результатом
побитного ИЛИ (операция | в языке C) прав на выполнение операций и
флагов, например:
        msqid = msgget (key, (IPC_CREAT | 0644));
        msqid = msgget (key, (IPC_CREAT | IPC_EXCL | 0400));
Как уже указывалось, системный вызов вида
   msqid = msgget (IPC_PRIVATE, msgflg);
приведет к попытке выделения нового идентификатора очереди сообщений и ассоциированной информации независимо от значения аргумента msgflg. Попытка может быть неудачной только из-за превышения системного лимита на общее число очередей сообщений, задаваемого настраиваемым параметром MSGMNI.
При использовании флага IPC_EXCL в сочетании с IPC_CREAT системный вызов msgget завершается неудачей в том и только в том случае, когда с указанным ключом key уже ассоциирован идентификатор. Флаг IPC_EXCL необходим, чтобы предотвратить ситуацию, когда процесс полагает, что получил новый (уникальный) идентификатор очереди сообщений, в то время как это не так. Иными словами, когда используются и IPC_CREAT и IPC_EXCL, при успешном завершении системного вызова обязательно возвращается новый идентификатор msqid.
В справочной статье по msgget описывается начальное значение ассоциированной структуры данных, формируемое при успешном завершении системного вызова. В статье содержится перечень условий, приводящих к ошибкам, и соответствующих им мнемонических имен для значений переменной errno.
| 
Закладки на сайте Проследить за страницей  | 
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру  |