/* Программа 08-1a.c для иллюстрации работы с семафорами */ /* Эта программа получает доступ к одному системному семафору, ждет, пока его значение не станет больше или равным 1 после запусков программы 08-1b.c,а затем уменьшает его на 1*/ #include #include #include #include #include int main() { int semid; /* IPC дескриптор для массива IPC семафоров */ char pathname[] = "sem08-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; }