151
ров в наборе семафоров.
-c Показать имя и группу создателя активных семафоров, очередей сообщений и разделяемых сегментов памяти.
-m Вывести информацию об активных сегментах разделяемой памяти.
-o Показать пиковое использование активных очередей сообщений и разделяемых сегментов памяти. ``Пиковое использование'' -- это количество сообщений в очереди сообщений, или количество процессов, подключенных к разделяемому сегменту памяти.
-p Показать информацию об идентификаторе процесса для активных семафоров, очередей сообщений и разделяемых сегментов памяти. ``Идентификатором процесса'' является последний процесс, отправивший или получивший сообщение из очереди сообщений, процесс, создавший семафор, или последний процесс, подключившийся или отключившийся от разделяемого сегмента памяти.
-q Вывести информацию об активных очередях сообщений. -s Вывести информацию об активных семафорах.
-t Показать время доступа к активным семафорам, очередям сообщений и
разделяемым сегментам памяти. Время доступа -- это время последней операции управления IPC объектом, последняя отправка или приём сообщения, последнее подключение или отключение от разделяемого сегмента памяти, или последняя операция с семафором.
-C дамп
Извлечь значения из списка имён (namelist) указанного дампа памяти ядра, вместо определённого по умолчанию /dev/kmem. Подразумевает -y.
-M Вывести системную информацию о разделяемой памяти.
-N система
Извлечь список имён из указанной системы, вместо определённой по умолчанию /boot/kernel/kernel. Подразумевает -y.
-Q Вывести системную информацию об очередях сообщений. -S Вывести системную информацию о семафорах.
-T Вывести системную информацию о разделяемой памяти, очередях сообщений и семафорах.
-y Использовать интерфейс kvm вместо интерфейса sysctl для извлечения необходимой информации. Если ipcs запущена на работающей системе, использование kvm(3) потребует привилегии чтения из /dev/kmem.
-u пользователь
Вывести информацию о механизмах IPC для указанного пользователя. Пользователь может быть задан либо числовым идентификатором UID, либо регистрационным именем.
Замечание
Если не указана ни одна из опция -M, -m, -Q, -q, -S, или -s, то выводится информация обо всех активных средствах IPC.
152
ipcrm [-q msqid] [-m shmid] [-s semid] [-Q msgkey] [-M shmkey]
[-S semkey] ...
ipcrm удаляет указанные очереди сообщений, семафоры и разделяемые сегменты памяти из системы. Требуемые объекты System V IPC задаются идентификатором их создания или любым связанным с ними ключом.
Для выбора объектов IPC, которые будут удалены, используются следующие опции, которых может быть задано любое число и любая комбинация:
-q msqid
Удалить из системы очередь сообщений, связанную с идентификатором msqid.
-m shmid
Пометить для удаления разделяемый сегмент памяти, связанный с идентификатором shmid. Этот помеченный сегмент будет уничтожен после отключения от него последнего процесса.
-s semid
Удалить из системы набор семафоров, связанный с идентификатором semid.
-Q msgkey
Удалить из системы очередь сообщений, связанную с ключом msgkey.
-M shmkey
Пометить для удаления разделяемый сегмент памяти, связанный с ключом shmkey. Этот помеченный сегмент будет уничтожен после отключения от него последнего процесса.
-S semkey
Удалить из системы набор семафоров, связанный с ключом semkey.
Замечание
Идентификаторы и ключи, связанные с этими объектами System V IPC, могут быть найдены с помощью утилиты ipcs.
Для решения проблем взаимого исключения и взаимной блокировки были предприняты значительные усилия. Естественно, что указанные проблемы коснулись и стандарта POSIX, в частности, стандарта POSIX-2001. Со временем, вопросы согласования действий между взаимодействующими процессами стали называть задачами синхронизации.
Одним из первых механизмов, предложенных для синхронизации поведения процессов, стали семафоры, концепцию которых описал Дейкстра (Dijkstra) в 1965 году. При разработке средств System V IPC семафоры вошли в их состав как неотъемлемая часть.
153
Замечание
Следует отметить, что набор операций над семафорами System V IPC отличается от классического набора операций, предложенного Дейкстрой.
Набор действий над семафорами System V IPC включает три операции:
A(S, n) — семафор S увеличивается на n;
D(S, n) – пока значение семафора S < n, процесс блокируется. Далее, выполняется S = S - n;
Z(S) – процесс блокируется до тех пор, пока значение семафора S не станет равным 0.
Основная идея реализации этого механизма, предполагает, что:
•семафор - это минимальный примитив синхронизации, служащий основой для
более сложных механизмов синхронизации, определенных в прикладной программе;
•у семафора есть значение, которое представляется целым числом в диапазоне от 0 до 32767;
•прикладная реализация механизма синхронизации обеспечивается набором
(массивом) семафоров, операции над этими наборами, для приложений
являются атомарными;
•гарантом атомарности операций на наборами является ядро ОС, в котором
и реализованы механизмы синхронизации.
Непосредственно в пакете IPC, работа с семафорами осуществляется с помощью трех системных вызовов:
//Необходимо для совместимости со старыми версиями //#include <sys/types.h>
//#include <sys/ipc.h>
#include <sys/sem.h>
int semget |
(key_t key, |
int |
nsems, |
int |
semflg); |
|
int semop |
(int |
semid, |
struct sembuf *sops, |
size_t nsops); |
||
int semctl |
(int |
semid, |
int |
semnum, |
int |
cmd, ...); |
Рассмотрим каждый из этих вызовов - отдельно.
Системный вызов semget(...) предназначен для выполнения операции доступа к массиву IPC-семафоров или его создание.
В случае его успешного завершения, возвращается дескриптор System V IPC для этого массива, которое является целым неотрицательным числом, однозначно характеризует массив семафоров внутри вычислительной системы и используется в дальнейших операциях над ним:
int semget (key_t key, int nsems, int semflg);
где key — ключ, ассоциированный с семафором и генерируемый функцией ftok(...); nsems - задает число семафоров в наборе;
154
semflg — флаг семафора; обычно ассоциируется с константами:
•IPC_CREAT — если массива для указанного ключа не существует, он должен быть создан;
•IPC_EXCL — применяется совместно с флагом IPC_CREAT; при совместном
их использовании и существовании массива с указанным ключом, доступ к массиву не производится и констатируется ошибка; при этом, переменная
errno, описанная в файле <errno.h>, примет значение EEXIST.
Дополнительные права доступа могут иметь значения:
0400 — разрешено чтение для пользователя, создавшего массив;
0200 — разрешена запись для пользователя, создавшего массив;
0040 — разрешено чтение для группы пользователя, создавшего массив;
0020 — разрешена запись для группы пользователя, создавшего массив;
0004 — разрешено чтение для всех остальных пользователей;
0002 — разрешена запись для всех остальных пользователей.
Вслучае ошибки, возвращается -1, а переменной errno присваивается ее номер:
•EACCES - набор семафоров существует для ключа key, но вызывающий процесс не имеет прав на доступ к набору;
•EEXIST - набор семафоров существует для ключа key, а в semflg не включены флаги IPC_CREAT и IPC_EXCL;
•ENOENT - набора семафоров для ключа key не существует, а в semflg не включен флаг IPC_CREAT;
•EINVAL - значение nsems меньше 0 или больше максимально возможного для
набора количества семафоров (SEMMSL), или набор семафоров, соответствующий key уже существует и nsems больше, чем количество семафоров в этом наборе;
•ENOMEM - набор семафоров должен быть создан, но недостаточно памяти для создания новой структуры;
•ENOSPC - набор семафоров должен быть создан, но при этом будет превы-
шен системный лимит количества наборов семафоров (SEMMNI) или системный лимит количества семафоров (SEMMNS).
Замечание
Вновь созданные семафоры инициируются нулевым значением.
Системный вызов semop(...) предназначен для выполнения операций A, D и Z на основе ключа, который получен системным вызовом semget(...):
int semop (int semid, struct sembuf *sops, size_t nsops);
где semid — идентификатор набора семафоров, созданный функцией semget(...); sops — указатель на массив структур, с числом элементов nsops, состоящим из структур типа sembuf;
nsops - число семафоров, указанное при вызове semget(...).
При успешном завершении возвращает 0, иначе — возвращает -1, а переменной errno присваивается номер:
155
•E2BIG - значение аргумента nsops больше, чем значение SEMOPM, указывающее на максимальное количество операций для системного вызова;
•EACCES - вызывающий процесс не имеет прав на доступ к набору семафоров;
•EAGAIN - операция не может быть исполнена немедленно и либо
IPC_NOWAIT было указан в его sem_flg или истекло время лимита, определенное в timeout;
•EFAULT - адрес, указанный либо в sops либо в timeout не доступен;
•EFBIG - для некоторых операций значение sem_num меньше нуля или больше или равно количеству семафоров в наборе;
•EIDRM - набор семафоров был удален;
•EINTR - процесс, находясь в режиме ожидания, получает сигнал, который должен быть обработан;
•EINVAL - набор семафоров не существует, или значение semid меньше нуля или nsops имеет отрицательное значение;
•ENOMEM - для выполнения некоторых операций в поле sem_flg стоит флаг
SEM_UNDO, и система не имеет достаточно памяти для записи структуры выполнения обратных операций;
•ERANGE - для некоторых операций значение semop+semval является большим, чем SEMVMX, максимальное значение semval, заданное в ядре.
Действия, которые выполняются над набором семафоров, определяются вторым аргументом системного вызова semop(...), являющимся указателем на мас-сив сируктур типа sembuf.
Каждая структура типа sembuf содержит, по крайней мере, следующие три поля:
unsigned short sem_num; |
// Номер |
семафора в наборе (нумерация с |
нуля) |
||
short |
sem_op; |
// |
Запрашиваемая операция над семафором |
|
|
short |
sem_flg; |
// |
Флаги |
операции: 0 — операции с блокировкой |
|
Операция над конкретным семафором определяется значением поля sem_op:
•положительное значение предписывает увеличить значение семафора на указанную величину, соответствует операции A(S,n);
•отрицательное - уменьшить, соответствует операции D(S,n);
•нулевое - сравнить с нулем, соответствует операции Z(S).
Замечание
Вторая операция не может быть успешно выполнена, если в результате значение семафора становится отрицательным, а третья - если значение семафора ненулевое. В таких случаях, процесс выполняющий операцию — блокируется.
С точки зрения пользовательского процесса, выполнение операций над массивом семафоров является неделимым действием. Это значит:
• если операции выполняются, то только все вместе;