/* Программа 1 для
иллюстрации работы с семафорами */
/* Эта программа получает доступ к одному
системному семафору, #include <sys/types.h>
ждет пока его значение не станет больше или равным 1 после запусков
программы 2,
а затем уменьшает его на 1*/
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
int main()
{
char pathname[] = "08-1a.c"; /* Имя файла, использующееся для генерации ключа.
Файл с таким именем должен существовать в текущей директории */
key_t key; /* IPC ключ */
struct sembuf mybuf; /* Структура для задания операции над семафором */
/* Генерируем IPC ключ из имени файла 08-1a.c в текущей директории
и номера экземпляра области разделяемой памяти 0 */
if((key = ftok(pathname,0)) < 0){
exit(-1);
/* Пытаемся получить доступ по ключу к массиву семафоров, если он существует,
или создать его из одного семафора, если он еще не существует, с правами доступа
read & write для всех пользователей */
if((semid = semget(key, 1, 0666 | IPC_CREAT))
< 0){
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){
exit(-1);
printf("Condition is present\n");
return 0;