ИМЯ
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 [AT] perm.ru> 2004