Данная страница руководства описывает реализацию механизмов межпроцессного
взаимодействия System V для Linux:
очереди сообщений, списки семафоров и сегменты разделяемой памяти.
Далее, слово
ресурс
означает сущность, созданную в результате работы одного из этих
механизмов.
Права доступа к ресурсу
Для каждого ресурса система использует обобщенную структуру типа
struct ipc_perm
для хранения информации, которая необходима для определения прав
на выполнение какой-либо операции ipc.
Структура
ipc_perm
определяется в заголовочном файле
<sys/ipc.h>
и содержит следующие поля:
ushort cuid;
/* идентификатор пользователя, создавшего ресурс */
ushort cgid;
/* идентификатор группы, создавшей ресурс */
ushort uid;
/* идентификатор владельца */
ushort gid;
/* идентификатор группы */
ushort mode;
/* права на чтение/запись */
В поле
mode
структуры
ipc_perm
рабочими являются младшие 9 битов и представляют собой права доступа к
ресурсу для процесса, сделавшего ipc вызов.
Права интерпретируются так:
0400 Чтение для пользователя
0200 Запись для пользователя
0040 Чтение для группы
0020 Запись для группы
0004 Чтение для других
0002 Запись для других
Биты 0100, 0010 и 0001 (биты выполнения) системой не используются.
Кроме того
"запись"
для списка семафоров фактически означает
"изменение".
В том же заголовочном файле также определяются следующие символьные
константы:
IPC_CREAT
Создать запись, если ключ не существует.
IPC_EXCL
Ошибка, если ключ существует.
IPC_NOWAIT
Ошибка, если запрос должен ждать.
IPC_PRIVATE
Личный ключ.
IPC_RMID
Удалить ресурс.
IPC_SET
Установить опции ресурса.
IPC_STAT
Получить опции ресурса.
Заметим, что
IPC_PRIVATE
имеет тип
key_t,
в то время как все остальные символьные константы являются полями-флагами,
для которых может выполняться операция логического сложения в переменную типа
int.
Очереди Сообщений
Очередь сообщений идентифицируется уникальным положительным целым числом
(msqid),
связанным со структурой данных типа
struct msqid_ds,
которая определяется в заголовочном файле
<sys/msg.h>,
и которая содержит следующие поля:
struct ipc_perm msg_perm; ushort msg_qnum;
/* количество сообщений в очереди */
ushort msg_qbytes;
/* максимальное количество байт в очереди */
ushort msg_lspid;
/* pid, идентификатор процесса, выполнившего последний вызов msgsnd */
ushort msg_lrpid;
/* pid, идентификатор процесса, выполнившего последний вызов msgrcv */
time_t msg_stime;
/* время последнего вызова msgsnd */
time_t msg_rtime;
/* время последнего вызова msgrcv */
time_t msg_ctime;
/* время последнего изменения */
msg_perm
Структура
ipc_perm
задает права доступа к очереди сообщения.
msg_qnum
Количество сообщений, которые в данный момент находятся в очереди.
msg_qbytes
Максимальное количество байтов текста сообщения, которое допускается
в очереди.
msg_lspid
Идентификатор процесса, который выполнил последний
системный вызов
msgsnd.
msg_lrpid
Идентификатор процесса, который выполнил последний
системный вызов
msgrcv.
msg_stime
Время, когда был выполнен последний системный вызов
msgsnd.
msg_rtime
Время, когда был выполнен последний системный вызов
msgcv.
msg_ctime
Время, когда был выполнен последний системный вызов,
который изменил в структуре поле
msqid_ds.
Списки семафоров
Список семафоров идентифицируется уникальным положительным целым
числом
(semid),
связанным со структурой данных типа
struct semid_ds,
которая определяется в заголовочном файле
<sys/sem.h>
и которая содержит следующие поля:
struct ipc_perm sem_perm; time_t sem_otime;
/* время последней операции */
time_t sem_ctime;
/* время последнего изменения */
ushort sem_nsems;
/* количество семафоров в списке */
sem_perm
Структура
ipc_perm,
которая задает права доступа к списку семафоров.
sem_otime
Время последнего системного вызова
semop.
sem_ctime
Время последнего системного вызова
semctl,
который изменяет значение какого-либо из полей структуры или один
из семафоров в списке.
sem_nsems
Количество семафоров в списке.
Семафоры в списке нумеруются положительными целыми числами от нуля до
sem_nsems-1.
Семафор -- это структура данных типа
struct sem,
которая содержит следующие поля:
ushort semval;
/* значение семафора */
short sempid;
/* pid последней операции */
ushort semncnt;
/* Количество ожидающих увеличения semval */
ushort semzcnt;
/* Количество ожидающих установки semval в нуль */
semval
Значение семафора: неотрицательное целое число.
sempid
Идентификатор последнего процесса, который работал с данным семафором.
semncnt
Количество процессов, приостановленных в ожидании увеличения
semval.
semznt
Количество процессов, приостановленных в ожидании установки значения
semval
в нуль.
Сегменты Разделяемой Памяти
Сегмент разделяемой памяти идентифицируется уникальным положительным
целым числом
(shmid),
которое связано со структурой данных типа
struct shmid_ds,
которая определяется в заголовочном файле
<sys/shm.h>
и которая содержит следующие поля:
struct ipc_perm shm_perm; int shm_segsz;
/* размер сегмента */
ushort shm_cpid;
/* pid создателя */
ushort shm_lpid;
/* pid последней операции */
short shm_nattch;
/* Количество подключенных в данный момент */
time_t shm_atime;
/* время последнего подключения */
time_t shm_dtime;
/* время последнего отключения */
time_t shm_ctime;
/* время последнего изменения */
shm_perm
Структура
ipc_perm,
которая задает права доступа к разделяемому сегменту памяти.
shm_segsz
Размер разделяемого сегмента памяти в байтах.
shm_cpid
Идентификатор процесса, который создал разделяемый сегмент памяти.
shm_lpid
Идентификатор последнего процесса, который делал системные вызовы
shmat
или
shmdt.
shm_nattch
Количество процессов, которые в данный момент подключены к данному
разделяемому сегменту памяти.
shm_atime
Время последнего системного вызова
shmat.
shm_dtime
Время последнего системного вызова
shmdt.
shm_ctime
Время последнего системного вызова
shmctl,
который изменил
shmid_ds.