Linux
2016-03-15
Aliases: svipc(7), svipc(7), svipc(7), svipc(7), svipc(7)
man-pages-ru
Russian man pages from the Linux Documentation Project
manpages
Manual pages about using a GNU/Linux system
man-pages
Linux kernel and C library user-space interface documentation
ИМЯ
sysvipc - механизмы межпроцессного взаимодействия System V
ОБЗОР
#include <sys/msg.h> #include <sys/sem.h> #include <sys/shm.h>
ОПИСАНИЕ
Данная справочная страница описывает реализацию механизмов межпроцессного взаимодействия (IPC) System V в Linux: очереди сообщений, наборы семафоров и сегменты разделяемой памяти. В дальнейшем под словом ресурс будет подразумеваться экземпляр одного из этих механизмов.
Права доступа к ресурсу
Для каждого ресурса система использует общую структуру типа struct ipc_perm, хранящую необходимую информацию о правах для проведения IPC-операции. Структура ipc_perm включает следующие поля:
Заметьте, что IPC_PRIVATE является типом key_t, когда как остальные символические константы являются флагами и могут быть объединены с помощью логического ИЛИ в переменную типа int.
struct ipc_perm {
uid_t cuid; /* ID пользователя создателя */
gid_t cgid; /* ID группы создателя */
uid_t uid; /* ID пользователя владельца */
gid_t gid; /* ID группы владельца */
unsigned short mode; /* права для чтения-записи */ };
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 | Получить параметры ресурса. |
Очереди сообщений
Очередь сообщений уникально идентифицируется положительным целым (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; /* последнее время изменения */ };
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 sem, содержащие следующие поля:
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 {
int semval; /* значение семафора */
int sempid; /* PID последнего изменившего процесса */ };
int semval; /* значение семафора */
int sempid; /* PID последнего изменившего процесса */ };
semval | Значение семафора, неотрицательное целое. |
sempid | PID последнего процесса, изменившего значение данного семафора. |
Сегменты общей памяти
Сегмент общей памяти уникально идентифицируется положительным целым (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; /* время последнего изменения */ };
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. |
Пространства имён IPC
Обсуждение связи объектов System V IPC с пространствами IPC смотрите в ipc_namespaces(7).