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

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 смотрите в namespaces(7).

СМОТРИТЕ ТАКЖЕ
ipcmk(1), ipcrm(1), ipcs(1), lsipc(1), 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), namespaces(7)