ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Написать фрагмент программы, которая показывает синхронизацию процессов с помощью семофоров/* Программа 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 "); exit(-1); } /* Пытаемся получить доступ по ключу к массиву семафоров, если он существует, или создать его из одного семафора, если его еще не существует, с правами доступа read & write для всех пользователей */ if((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0){ printf("Can′t get semid "); 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 "); exit(-1); } printf("Condition is present "); return 0; }
/* Программа 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 "); exit(-1); } /* Пытаемся получить доступ по ключу к массиву семафоров, если он существует, или создать его из одного семафора, если его еще не существует, с правами доступа read & write для всех пользователей */ if((semid = semget(key, 1, 0666 | IPC_CREAT)) < 0){ printf("Can′t get semid "); exit(-1); } /* Выполним операцию A(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 "); exit(-1); } printf("Condition is set "); return 0; }
Не нашли, что искали? Воспользуйтесь поиском:
|