Scroll to navigation

SVIPC(7) Руководство программиста Linux SVIPC(7)

ИМЯ

svipc - механизмы межпроцессного взаимодействия System V

ОБЗОР

#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_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; /* последнее время изменения */ };

Структура ipc_perm, определяющая права доступа к очереди сообщений.
Число сообщений, находящихся в данный момент в очереди сообщений.
Максимальная длина сообщения в байтах, разрешенная в очереди сообщений.
ID процесса, выполнившего последний системный вызов msgsnd(2).
ID процесса, выполнившего последний системный вызов msgrcv(2).
Время последнего вызова msgsnd(2).
Время последнего вызова msgrcv(2).
Время последнего системного вызова, изменившего поля структуры 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; /* число семафоров в наборе */ };

Структура ipc_perm, определяющая права доступа к набору семафоров.
Время последнего системного вызова semop(2).
Время последнего системного вызова semctl(2), который изменил поле указанной структуры или один из семафоров, принадлежащих набору.
Число семафоров в наборе. Каждый семафор описывается неотрицательным целым числом от 0 до sem_nsems-1.

Семафор является структурой данных типа struct sem, содержащие следующие поля:

struct sem {

int semval; /* значение семафора */
int sempid; /* PID последней операции */ };

Значение семафора, неотрицательное целое.
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; /* время последнего изменения */ };

Структура ipc_perm, описывающая права доступа к сегменту общей памяти.
Размер в байтах сегмента общей памяти.
ID процесса, создавшего сегмент общей памяти.
ID последнего процесса, выполнившего системный вызов shmat(2) или shmdt(2).
Количество текущих подключений для данного сегмента общей памяти.
Время последнего системного вызова shmat(2).
Время последнего системного вызова shmdt(2).
Время последнего системного вызова shmctl(2), изменившего shmid_ds.

СМОТРИТЕ ТАКЖЕ

ipc(2), msgctl(2), msgget(2), msgrcv(2), msgsnd(2), semctl(2), semget(2), semop(2), shmat(2), shmctl(2), shmdt(2), shmget(2), ftok(3)

2012-05-31 Linux