Семафоры
Межпроцессное взаимодействие
Механизм IPC (Inter-Process Communication Facilities) включает:
Наиболее общим понятием IPC является ключ, хранимый в общесистемной таблице и обозначающий объект межпроцессного взаимодействия, доступный нескольким процессам. Обозначаемый ключом объект может быть очередью сообщений, набором семафоров или сегментом разделяемой памяти. Ключ имеет тип key_t, состав которого зависит от реализации и определяется в файле sys/types.h. Ключ используется для создания объекта межпроцессного взаимодействия или получения доступа к существующему объекту. Обе операции выполняются посредством операции get. Результатом операции get является его целочисленный идентификатор, который может использоваться в других функциях межпроцессного взаимодействия.
Семафоры
Для работы с семафорами поддерживаются три системных вызова:
Прототипы перечисленных системных вызовов описаны в файлах: #include <sys/ipc.h>#include <sys/sem.h>
Системный вызов semget() имеет следующий синтаксис: semid = int semget(key_t key, int count, int flag);Его параметрами являются ключ (key) набора семафоров и дополнительные флаги (flags), определенные в <sys/ipc.h>, число семафоров в наборе семафоров (count), обладающих одним и тем же ключом. Системный вызов возвращает идентификатор набора семафоров semid. После вызова semget() индивидуальный семафор идентифицируется идентификатором набора семафоров и номером семафора в этом наборе. Флаги системного вызова semget() приведены в таблице:
Младшие 9 бит флага задают права доступа к набору семафоров. Системный вызов semctl() имеет формат: int semctl (int semid, int sem_num, int command, union semun arg);где semid - это идентификатор набора семафоров, sem_numb - номер семафора в группе, command - код операции, а arg - указатель на структуру, содержимое которой интерпретируется по-разному, в зависимости от операции. Структура msg имеет вид: union semun { int val; struct semid_ds *buf; unsigned short *array; };С помощью semctl() можно:
Основным системным вызовом для манипулирования семафором является: int semop (int semid, struct sembuf *op_array, count);где semid - это ранее полученный дескриптор группы семафоров, op_array - массив структур sembuf, определенных в файле <sys/sem.h> и содержащих описания операций над семафорами группы, а count - размер этого массива. Значение, возвращаемое системным вызовом, является значением последнего обработанного семафора. Каждый элемент массива op_array имеет следующую структуру (структура sembuf):
Если указанные в массиве op_array номера семафоров не выходят за пределы общего размера набора семафоров, то системный вызов последовательно меняет значение семафора (если это возможно) в соответствии со значением поля "операция". Возможны три случая:
При использовании флага IPC_NOWAIT ядро ОС UNIX не блокирует текущий процесс, а лишь сообщает в ответных параметрах о возникновении ситуации, приведшей бы к блокированию процесса при отсутствии флага IPC_NOWAIT.
|