Scroll to navigation

IPC(5) Руководство программиста Linux 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_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;
/* время последнего изменения */

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

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

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


ushort semval;
/* значение семафора */

short sempid;
/* pid последней операции */

ushort semncnt;
/* Количество ожидающих увеличения semval */

ushort semzcnt;
/* Количество ожидающих установки semval в нуль */

Значение семафора: неотрицательное целое число.
Идентификатор последнего процесса, который работал с данным семафором.
Количество процессов, приостановленных в ожидании увеличения semval.
Количество процессов, приостановленных в ожидании установки значения 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;
/* время последнего изменения */

Структура ipc_perm, которая задает права доступа к разделяемому сегменту памяти.
Размер разделяемого сегмента памяти в байтах.
Идентификатор процесса, который создал разделяемый сегмент памяти.
Идентификатор последнего процесса, который делал системные вызовы shmat или shmdt.
Количество процессов, которые в данный момент подключены к данному разделяемому сегменту памяти.
Время последнего системного вызова shmat.
Время последнего системного вызова shmdt.
Время последнего системного вызова 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

1993-11-01 Linux 0.99.13