IPC(5)

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

ОБЗОР
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
# include <sys/sem.h>
# include <sys/shm.h>

ОПИСАНИЕ
Данная страница руководства описывает реализацию механизмов межпроцессного взаимодействия System V для Linux: очереди сообщений, списки семафоров и сегменты разделяемой памяти. Далее, слово ресурс означает сущность, созданную в результате работы одного из этих механизмов.

  Права доступа к ресурсу
Для каждого ресурса система использует обобщенную структуру типа struct ipc_perm для хранения информации, которая необходима для определения прав на выполнение какой-либо операции ipc. Структура ipc_perm определяется в заголовочном файле <sys/ipc.h> и содержит следующие поля:

        ushort cuid; /* идентификатор пользователя, создавшего ресурс */
        ushort cgid; /* идентификатор группы, создавшей ресурс */
        ushort uid; /* идентификатор владельца */
        ushort gid; /* идентификатор группы */
        ushort 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 ipc_perm msg_perm;
        ushort msg_qnum; /* количество сообщений в очереди */
        ushort msg_qbytes; /* максимальное количество байт в очереди */
        ushort msg_lspid; /* pid, идентификатор процесса, выполнившего последний вызов msgsnd */
        ushort msg_lrpid; /* pid, идентификатор процесса, выполнившего последний вызов msgrcv */
        time_t msg_stime; /* время последнего вызова msgsnd */
        time_t msg_rtime; /* время последнего вызова msgrcv */
        time_t msg_ctime; /* время последнего изменения */

msg_perm
    Структура ipc_perm задает права доступа к очереди сообщения.

msg_qnum
    Количество сообщений, которые в данный момент находятся в очереди.

msg_qbytes
    Максимальное количество байтов текста сообщения, которое допускается в очереди.

msg_lspid
    Идентификатор процесса, который выполнил последний системный вызов msgsnd.

msg_lrpid
    Идентификатор процесса, который выполнил последний системный вызов msgrcv.

msg_stime
    Время, когда был выполнен последний системный вызов msgsnd.

msg_rtime
    Время, когда был выполнен последний системный вызов msgcv.

msg_ctime
    Время, когда был выполнен последний системный вызов, который изменил в структуре поле msqid_ds.

  Списки семафоров
Список семафоров идентифицируется уникальным положительным целым числом (semid), связанным со структурой данных типа struct semid_ds, которая определяется в заголовочном файле <sys/sem.h> и которая содержит следующие поля:

        struct ipc_perm sem_perm;
        time_t sem_otime; /* время последней операции */
        time_t sem_ctime; /* время последнего изменения */
        ushort sem_nsems; /* количество семафоров в списке */

sem_perm
    Структура ipc_perm, которая задает права доступа к списку семафоров.

sem_otime
    Время последнего системного вызова semop.

sem_ctime
    Время последнего системного вызова semctl, который изменяет значение какого-либо из полей структуры или один из семафоров в списке.

sem_nsems
    Количество семафоров в списке. Семафоры в списке нумеруются положительными целыми числами от нуля до sem_nsems-1.

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

        ushort semval; /* значение семафора */
        short sempid; /* pid последней операции */
        ushort semncnt; /* Количество ожидающих увеличения semval */
        ushort semzcnt; /* Количество ожидающих установки semval в нуль */

semval
    Значение семафора: неотрицательное целое число.

sempid
    Идентификатор последнего процесса, который работал с данным семафором.

semncnt
    Количество процессов, приостановленных в ожидании увеличения semval.

semznt
    Количество процессов, приостановленных в ожидании установки значения semval в нуль.

  Сегменты Разделяемой Памяти
Сегмент разделяемой памяти идентифицируется уникальным положительным целым числом (shmid), которое связано со структурой данных типа struct shmid_ds, которая определяется в заголовочном файле <sys/shm.h> и которая содержит следующие поля:

        struct ipc_perm shm_perm;
        int shm_segsz; /* размер сегмента */
        ushort shm_cpid; /* pid создателя */
        ushort shm_lpid; /* pid последней операции */
        short shm_nattch; /* Количество подключенных в данный момент */
        time_t shm_atime; /* время последнего подключения */
        time_t shm_dtime; /* время последнего отключения */
        time_t shm_ctime; /* время последнего изменения */

shm_perm
    Структура ipc_perm, которая задает права доступа к разделяемому сегменту памяти.

shm_segsz
    Размер разделяемого сегмента памяти в байтах.

shm_cpid
    Идентификатор процесса, который создал разделяемый сегмент памяти.

shm_lpid
    Идентификатор последнего процесса, который делал системные вызовы shmat или shmdt.

shm_nattch
    Количество процессов, которые в данный момент подключены к данному разделяемому сегменту памяти.

shm_atime
    Время последнего системного вызова shmat.

shm_dtime
    Время последнего системного вызова shmdt.

shm_ctime
    Время последнего системного вызова shmctl, который изменил shmid_ds.

СМОТРИ ТАКЖЕ
ftok(3), msgctl(2), msgget(2), msgrcv(2), msgsnd(2), semctl(2), semget(2), semop(2), shmat(2), shmctl(2), shmget(2), shmdt(2)

ПЕРЕВОД
Перевёл с английского Виктор Вислобоков <corochoone@perm.ru> 2004