Основы операционных систем. Практикум



         

Прогон примера с использованием семафора


Для иллюстрации сказанного рассмотрим простейшие программы, синхронизирующие свои действия с помощью семафоров

/* Программа 08-1a.c для иллюстрации работы с семафорами */ /* Эта программа получает доступ к одному системному семафору, ждет, пока его значение не станет больше или равным 1 после запусков программы 08-1b.c,а затем уменьшает его на 1*/ #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <stdio.h> int main() { int semid; /* IPC дескриптор для массива IPC семафоров */ char pathname[] = "08-1a.c"; /* Имя файла, использующееся для генерации ключа. Файл с таким именем должен существовать в текущей директории */ key_t key; /* IPC ключ */ struct sembuf mybuf; /* Структура для задания операции над семафором */ /* Генерируем IPC-ключ из имени файла 08-1a.c в текущей директории и номера экземпляра массива семафоров 0 */ if((key = ftok(pathname,0)) < 0){ printf("Can\'t generate key\n"); exit(-1); } /* Пытаемся получить доступ по ключу к массиву семафоров, если он существует, или создать его из одного семафора, если его еще не существует, с правами доступа read & write для всех пользователей */ if((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0){ printf("Can\'t get semid\n"); exit(-1); } /* Выполним операцию D(semid1,1) для нашего массива семафоров. Для этого сначала заполним нашу структуру. Флаг, как обычно, полагаем равным 0. Наш массив семафоров состоит из одного семафора с номером 0. Код операции -1.*/ mybuf.sem_op = -1; mybuf.sem_flg = 0; mybuf.sem_num = 0; if(semop(semid, &mybuf, 1) < 0){ printf("Can\'t wait for condition\n"); exit(-1); } printf("Condition is present\n"); return 0; }

Листинг 8.1. Программа 08-1a.c для иллюстрации работы с семафорами

/* Программа 08-1b.c для иллюстрации работы с семафорами */ /* Эта программа получает доступ к одному системному семафору и увеличивает его на 1*/ #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <stdio.h> int main() { int semid; /* IPC дескриптор для массива IPC семафоров */ char pathname[] = "08-1a.c"; /* Имя файла, использующееся для генерации ключа.


Содержание  Назад  Вперед