OpenSCADAWiki: Roman Savochenko/C Short All/part2/part20
 

2.20 IPC (Inter Process Communication)

ftok <sys/types.h, sys/ipc.h>
key_t ftok(char *pathname, char proj);
Преобразует имя файла и идентификатор проекта в ключ для системных вызовов.

2.20.1 Сообщения

msgctl (SVr4, SVID) <sys/types.h, sys/ipc.h, sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
Послать команду <cmd> сообщению <msqid> с параметрами <buf>;

msgget (SVr4, SVID) <sys/types.h, sys/ipc.h, sys/msg.h>
int msgget(key_t key, int msgflg);
Возвращает дескриптор очереди сообщений для ключа <key> с правами доступа <msgflg>.

msgsnd (SVr4, SVID) <sys/types.h, sys/ipc.h, sys/msg.h>
int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
Отправить сообщение <msgp> длиной <msgsz> и с флагами <msgflg>, по дескриптору сообщения <msqid>.

msgrcv (SVr4, SVID) <sys/types.h, sys/ipc.h, sys/msg.h>
ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);
Получить сообщение из дескриптора сообщения msqid, в буфер <msgp> размером <msgsz> с типом <msgtyp> и флагами <msgflg>. Если <msgtyp>=0 - читать первое сообщение из очереди, если < 0 - получить сообщение с минимальным типом не менее msgtyp.

2.20.2 Семафоры

semget (SVID) <sys/types.h, sys/ipc.h, sys/sem.h>
int semget(key_t key, int nsems, int semflg);
Возвращает идентификатор семафора в соответствии с ключом <key>, опциями <semflg> и количеством семафором <nsems> (Табл [*]).

semctl (SVID) <sys/types.h, sys/ipc.h, sys/sem.h>
int semctl(int semid, int semnum, int cmd, union semun arg);
Производит операции <cmd> (Табл [*]) по управлению семафорами.

semop (SVID) <sys/types.h, sys/ipc.h, sys/sem.h>
int semop(int semid, struct sembuf *sops, unsigned nsops);
Производит операции над выбранными элементами из набора семафоров <semid>. Каждый из элементов <nsops> в массиве <sops> определяет операцию, производимую над семафором в структуре <struct sembuf>.

2.20.3 Разделяемая память

shm_open (POSIX.1-2001) <sys/types.h, sys/mman.h, fcntl.h>
int shm_open(const char *name, int oflag, mode_t mode);
Создание/открытие разделяемого объекта памяти под именем <name>.

shm_unlink (POSIX.1-2001) <sys/types.h, sys/mman.h, fcntl.h>
int shm_unlink(const char *name);
Удаление /отключение разделяемого объекта памяти с именем <name>.

shmget (SVID) <sys/ipc.h, sys/shm.h>
int shmget(key_t key, int size, int shmflg);
Возвращает идентификатор разделяемой памяти в соответствии с ключом <key>, размером <size> и опциями <shmflg> (Табл.16).

shmat, shmdt (SVID) <sys/types.h, sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
<shmat> - присоединяет сегмент разделяемой памяти <shmid> к сегменту данных вызывающего процесса. Адрес присоединяемого сегмента определяется функцией <shmaddr>.
<shmdt> - отстыковывает от сегмента данных вызывающего процесса сегмент разделяемой памяти, находящийся по адресу <shmaddr>.

shmctl (SVID) <sys/ipc.h, sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
Производит операции <cmd> (Табл.17) по управлению разделяемыми сегментами памяти.

Таблица 16. Флаги доступа к IPC
ФлагНазначение
IPC_CREATСоздавать при отсутствии.
IPC_EXCLОшибка, если существует и используется PC_CREAT.
IPC_NOWAITВыход по ошибке отсутствия, без ожидания.
MSG_NOERRORНе выходить по ошибке в длине сообщения, а обрезать его.
SHM_RNОкругление до ближайшей страницы.
SHM_RDONLYОткрыть разделяемую область в режиме только для чтения.
SEM_UNDOОтменить действия при завершении процесса.

Таблица 17. Операции над IPC
ОперацияОписание
GETALLПолучение значений всех семафоров множества.
GETNCNTЧисло процессов ожидающих ресурсов.
GETPIDВозвращает PID процесса выполнившего вызов <semop>.
GETVALВозвращает значение одного семафора из множества.
GETZCNTЧисло процессов ожидающих 100% освобождения ресурса.
IPC_RMIDУдалить очередь из ядра.
IPC_STATСохранить структуру с ID в буфере.
IPC_SETУстанавливает ipc_perm структуры c ID.
SETALLУстанавливает значения семафоров множества, взятые из элемента <array> объединения.
SETVALУстанавливает значение конкретного семафора как элемент <val> объединения.