ipc

Autres langues

Langue: ru

Autres versions - même langue

Version: 1993-11-01 (fedora - 25/11/07)

Autres sections - même nom

Section: 5 (Format de fichier)

ИМЯ

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