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

2016-03-15 Linux