Provided by:
manpages-ru_0.98-4_all 
ИМЯ
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