ОБЗОР
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/shm.h>
ОПИСАНИЕ
Данная справочная страница описывает реализацию механизмов межпроцессного взаимодействия (IPC) System V в Linux: очереди сообщений, наборы семафоров и сегменты разделяемой памяти. В дальнейшем под словом ресурс будет подразумеваться экземпляр одного из этих механизмов.Права доступа к ресурсу
Для каждого ресурса система использует общую структуру типа struct ipc_perm, хранящую необходимую информацию о правах для проведения IPC-операции. Структура ipc_perm включает следующие поля:struct ipc_perm { uid_t cuid; /* ID пользователя создателя */ gid_t cgid; /* ID группы создателя */ uid_t uid; /* ID пользователя владельца */ gid_t gid; /* ID группы владельца */ unsigned short 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 msqid_ds { struct ipc_perm msg_perm; msgqnum_t msg_qnum; /* в очереди не сообщений */ msglen_t msg_qbytes; /* макс. байт в очереди */ pid_t msg_lspid; /* PID последнего вызова msgsnd(2) */ pid_t msg_lrpid; /* PID последнего вызова msgrcv(2) */ time_t msg_stime; /* время последнего msgsnd(2) */ time_t msg_rtime; /* время последнего msgrcv(2) */ time_t msg_ctime; /* последнее время изменения */ };
- msg_perm
- Структура ipc_perm, определяющая права доступа к очереди сообщений.
- msg_qnum
- Число сообщений, находящихся в данный момент в очереди сообщений.
- msg_qbytes
- Максимальная длина сообщения в байтах, разрешенная в очереди сообщений.
- msg_lspid
- ID процесса, выполнившего последний системный вызов msgsnd(2).
- msg_lrpid
- ID процесса, выполнившего последний системный вызов msgrcv(2).
- msg_stime
- Время последнего вызова msgsnd(2).
- msg_rtime
- Время последнего вызова msgrcv(2).
- msg_ctime
- Время последнего системного вызова, изменившего поля структуры msgid_ds.
Наборы семафоров
Набор семафора уникально идентифицируется положительным целым (semid) и имеет связанную структуру типа struct semid_ds, определенную в <sys/sem.h> и содержащую следующие поля:struct semid_ds { struct ipc_perm sem_perm; time_t sem_otime; /* время последней операции */ time_t sem_ctime; /* время последнего изменения */ unsigned long sem_nsems; /* число семафоров в наборе */ };
- sem_perm
- Структура ipc_perm, определяющая права доступа к набору семафоров.
- sem_otime
- Время последнего системного вызова semop(2).
- sem_ctime
- Время последнего системного вызова semctl(2), который изменил поле указанной структуры или один из семафоров, принадлежащих набору.
- sem_nsems
- Число семафоров в наборе. Каждый семафор описывается неотрицательным целым числом от 0 до sem_nsems-1.
Семафор является структурой данных типа struct sem, содержащие следующие поля:
struct sem { int semval; /* значение семафора */ int sempid; /* PID последней операции */ };
- semval
- Значение семафора, неотрицательное целое.
- sempid
- ID последнего процесса, выполнявшего операцию над семафором.
Сегменты общей памяти
Сегмент общей памяти уникально идентифицируется положительным целым (shmid) и имеет связанную структуру данных struct shmid_ds, определённую в <sys/shm.h> и содержащую следующие поля:struct shmid_ds { struct ipc_perm shm_perm; size_t shm_segsz; /* размер сегмента */ pid_t shm_cpid; /* PID создателя */ pid_t shm_lpid; /* PID последней операции */ shmatt_t shm_nattch; /* число текущих подключений */ time_t shm_atime; /* время последнего подключения */ time_t shm_dtime; /* время последнего отключения */ time_t shm_ctime; /* время последнего изменения */ };
- shm_perm
- Структура ipc_perm, описывающая права доступа к сегменту общей памяти.
- shm_segsz
- Размер в байтах сегмента общей памяти.
- shm_cpid
- ID процесса, создавшего сегмент общей памяти.
- shm_lpid
- ID последнего процесса, выполнившего системный вызов shmat(2) или shmdt(2).
- shm_nattch
- Количество текущих подключений для данного сегмента общей памяти.
- shm_atime
- Время последнего системного вызова shmat(2).
- shm_dtime
- Время последнего системного вызова shmdt(2).
- shm_ctime
- Время последнего системного вызова shmctl(2), изменившего shmid_ds.