Руководство программиста для Linux


Семафоры - часть 2


Так же, как и для очередей сообщений, ядро отводит часть своего адресного пространства под структуру данных каждого множества семафоров. Структура определена в linux/sem.h: /* Структура данных semid для каждого множества семафоров системы */ struct semid_ds { struct ipc_perm sem_perm; /* права доступа, см. ipc.h */ time_t sem_otime; /* время последнего semop-а */ time_t sem_ctime; /* время последнего изменения */ struct sem *sem_base; /* указатель на первый семафор в массиве */ struct wait_queue *eventn; struct wait_queue *eventz; struct sem_undo *undo; /* запросы undo в этом массиве */ ushort sem_nsems; /* номера семафоров в массиве */ };

Так же, как с очередями сообщений, операции с этой структурой проводятся с помощью системных вызовов, а не грязными скальпелями. Вот некоторые описания полей.

sem_perm

Это пример структуры ipc_perm, котораф описана в linux/ipc.h. Она содержит информацию о доступе к множеству семафоров, включая права доступа и информацию о создателе множества (uid и т.д.).

sem_otime

Время последней операции semop() (подробнее чуть позже).

sem_ctime

Время последнего изменения структуры.

sem_base

Указатель на первый семафор в массиве.

sem_undo

Число запросов undo в массиве (подробнее еще чуть позже).

sem_nsems

Количество семафоров в массиве.

Структура sem ядра

В sem_ds есть указатель на базу массива семафоров. Каждый элемент массива имеет тип sem, который описан в linux/sem.h: /* Структура для каждого семафора в системе */ struct sem { short sempid; /* pid последней операции */ ushort semval; /* текущее значение */ ushort semncnt; /* число процессов, ждущих увеличения semval-а */ ushort semzcnt; /* число процессов, ждущих semval-а , равного 0 */ };

sem_pid

ID процесса, проделавшего последнюю операцию

sem_semval

Текущее значение семафора

sem_semncnt

Число процессов, ожидающих освобождения требуемых ресурсов

sem_semzcnt

Число процессов, ожидающих освобождения всех ресурсов

Системный вызов semget() используется для того, чтобы создать новое множество семафоров или получить доступ к старому. SYSTEM CALL: semget(); PROTOTYPE: int semget ( key_t key, int nsems, int semflg ); RETURNS: IPC-идентификатор множества семафоров в случае успеха -1 в случае ошибки errno: EACCESS (доступ отклонен) EEXIST (существует нельзя создать (IPC_ESCL)) EIDRM (множество помечено как удаляемое) ENOENT (множество не существует, не было исполнено ни одного IPC_CREAT-а) ENOMEM (не хватает памяти для новых семафоров) ENOSPC (превышен лимит на количество множеств семафоров) NOTES:




Начало  Назад  Вперед



Книжный магазин