Здавалка
Главная | Обратная связь

Системний виклик semop.



int semop (int semid, struct sembuf** sops, unsigned nsops);

Системний виклик semop використовується для виконання набору операцій над множиною семафорів, який асоційований з ідентифікатором semіd. Аргумент sops (масив структур) визначає, над якими семафорами будуть виконуватися операції і які саме. Структура, що описує операцію над одним семафором, визначається в такий спосіб:

struct sembuf

{

short sem_num; // Номер семафора

short sem_op; // Операція над семафором

short sem_flg; // Прапорці операції

};

Номер семафора задає конкретний семафор у множині, над яким повинна бути виконана операція.

Виконувана операція визначається в такий спосіб:

· Позитивне значення поля sem_op наказує збільшити значення семафора на величину sem_op.

· Негативне значення поля sem_op наказує зменшити значення семафора на абсолютну величину sem_op. Операція не може бути успішно виконана, якщо в результаті вийде негативне число.

· Нульове значення поля sem_op наказує порівняти значення семафора з нулем. Операція не може бути успішно виконана, якщо значення семафора відмінне від нуля.

Значення прапорців операцій (поле sem_flg):

- ІPC_NOWAІT -> Використання прапора IPC_NOWAIT у функції semop має наступний зміст: якщо ядро потрапляє в таку ситуацію, коли процес повинен призупинити своє виконання в очікуванні збільшення значення семафора вище певного рівня або, навпаки, зниження цього значення до 0, і якщо при цьому прапор IPC_NOWAIT встановлений, ядро виходить з функції з повідомленням про помилку. Таким чином, якщо не припиняти процес у разі неможливості виконання окремої операції, можна реалізувати умовний тип семафора.

- SEM_UNDO -> Якщо процес виконує операцію над семафором, захоплюючи при цьому деякі ресурси, і завершує свою роботу без приведення семафора в початковий стан, можуть виникнути небезпечні ситуації. Причинами виникнення таких ситуацій можуть бути як помилки програмування, так і сигнали, що призводять до раптового завершення виконання процесу. Якщо після того, як процес зменшить значення семафорів, він отримає сигнал kill, відновити колишні значення процесу вже не вдасться, оскільки сигнали даного типу не аналізуються процесом. Отже, інші процеси, намагаючись звернутися до семафора, виявлять, що останні заблоковані, хоча сам заблокований процес уже припинив своє існування. Щоб уникнути виникнення подібних ситуацій, у функції semop процес може встановити прапор SEM_UNDO; коли процес завершиться, ядро ​​дасть зворотний хід всім операціям, виконаним процесом. Для цього в розпорядженні у ядра є таблиця, в якій кожному процесу в системі відведений окремий запис. Запис таблиці містить покажчик на групу структур відновлення, по одній структурі на кожен використовуваний процесом семафор. Кожна структура відновлення складається з трьох елементів - ідентифікатора семафора, його порядкового номера в наборі і установочного значення.

Аргумент nsops специфікує кількість структур у масиві. Максимально припустимий розмір масиву визначається системним параметром SEMOPM, тобто в кожному системному виклику semop можна виконати не більш SEMOPM операцій.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.