Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
<b>}</b>В большинстве версий ОС Linux определение объединения
semunsemctlСуществует множество разных значений параметра command, допустимых в функции
semctlsemctlДва часто используемых значения
command□
SETVALvalsemun□
IPC_RMIDФункция
semctlcommandIPC_RMIDПрименение семафоров
Как видно из содержания предыдущих разделов, операции с семафорами могут быть очень сложными. Это не самое печальное, потому что программирование многих процессов или потоков с критическими секциями — очень трудная задача сама по себе, и наличие сложного программного интерфейса лишь увеличивает интеллектуальную нагрузку.
К счастью, большинство задач, нуждающихся в семафорах, можно решить, применяя единственный бинарный семафор — простейший тип семафора. В следующем примере (упражнение 14.1) вы используете полный программный интерфейс для создания очень простого интерфейса типа Р и V для бинарного семафора. Затем вы примените этот простенький интерфейс для демонстрации того, как функционируют семафоры.
В экспериментах с семафорами будет использоваться единственная программа sem1.с, которую вы сможете запускать несколько раз. Необязательный параметр будет применяться для того, чтобы показать, отвечает ли программа за создание и уничтожение семафора.
Вывод двух разных символов будет обозначать вход в критическую секцию и выход из нее. Программа, запущенная с параметром, выводит
XОXO1. После системных директив
#includesemunmainsemgetargc > 1set_semvalueop_charO#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <sys/sem.h>#include "semun.h"static int set_semvalue(void);static void del_semvalue(void);static int semaphore_p(void);static int semaphore_v(void);static int sem_id;int main(int argc, char *argv[]) { int i; int pause_time; char op_char = 'О'; srand((unsigned int)getpid()); sem_id = semget((key_t)1234, 1, 0666 | IPC_CREAT); if (argc >1) { if (!set_semvalue()) { fprintf(stderr, "Failed to initialize semaphoren"); exit(EXIT_FAILURE); } op_char = 'X'; sleep(2); }2. Далее следует цикл, в котором 10 раз выполняется вход в критическую секцию и выход из нее. Вы сначала выполняете вызов функции
semaphore_p for (i = 0; i < 10; i++) { if (!semaphore_p()) exit(EXIT_FAILURE); printf("%c", op_char); fflush(stdout); pause_time = rand() % 3; sleep(pause_time); printf("%c", op_char); fflush(stdout);3. После критической секции вы вызываете функцию
semaphore_vfordel_semvalue if (!semaphore_v()) exit(EXIT_FAILURE); pause_time = rand() % 2; sleep(pause_time); } printf("n%d - finishedn", getpid());