Системное программирование в UNIX средствами Free Pascal

       

Этот вызов лучше всего представить


uses ipc;
Function msgget(key:TKey; permflags:longint):longint;
Этот вызов лучше всего представить как аналог вызова fdopen или fdcreat. Как уже упоминалось в разделе 8.3.1, параметр key, который, в сущности, является простым числом, идентифицирует очередь сообщений в системе. В случае успешного вызова, после создания новой очереди или доступа к уже существующей, вызов msgget вернет ненулевое целое значение, которое называется идентификатором очереди сообщений (message queue identifier).
Параметр permflags указывает выполняемое вызовом msgget действие, которое задается при помощи двух констант, определенных в файле ipc; они могут использоваться по отдельности или объединяться при помощи операции побитового ИЛИ:
IPC_CREAT      При задании этого флага вызов msgget создает новую очередь сообщений для данного значения, если она еще не существует. Если продолжить аналогию с файлами, то при задании этого флага вызов msgget выполняется в соответствии с вызовом creat, хотя очередь сообщений и не будет «перезаписана», если она уже существует. Если же флаг
IPC_CREAT не установлен и очередь с этим ключом существует, то вызов msgget вернет идентификатор существующей очереди сообщений
IPC_EXCL        Если установлен этот флаг и флаг IPC_CREAT, то вызов предназначается только для создания очереди сообщений. Поэтому, если очередь с ключом key уже существует, то вызов msgget завершится неудачей и вернет значение -1. Переменная linuxerror будет при этом содержать значение Sys_EEXIST
При создании очереди сообщений младшие девять бит переменной permflags используются для задания прав доступа к очереди сообщений аналогично коду доступа к файлу. Они хранятся в структуре tipc_perm, создаваемой одновременно с самой очередью.
Теперь можно вернуться к примеру из раздела 8.3.1.
mqid := msgget(octal(0100), octal(0644) or IPC_CREAT or IPC_EXCL);
Этот вызов предназначен для создания (и только создания) очереди сообщений для значения ключа равного octal(0100). В случае успешного завершения вызова очередь будет иметь код доступа octal(0644). Этот код интерпретируется таким же образом, как и код доступа к файлу, обозначая, что создатель очереди может отправлять и принимать сообщения, а члены его группы и все остальные могут выполнять только чтение. При необходимости для изменения прав доступа или владельца очереди может использоваться вызов msgctl.

Содержание раздела