Advertisement
Shiyan12

client.c

Dec 6th, 2019
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.92 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <sys/ipc.h>
  3. #include <sys/sem.h>
  4. #include <sys/stat.h>
  5. // идентификатор набора семафоров
  6. #define KEY 100
  7. // сколько семафоров имеется в наборе
  8. #define NUM_SEM 5
  9.  
  10. int main() {
  11.     // права 777
  12.     int perms = S_IRWXU | S_IWUSR | S_IRGRP;
  13.     // прерывает свою работу, если нет набора семафоров
  14.     int fd = semget(KEY, NUM_SEM, 0);
  15.     // если нет набора семафоров
  16.     if (fd == -1) {
  17.         /* Открывается набор из 5-ти семафоров с идентификатором 100.
  18.         Этот набор создаётся с правами 777. */
  19.         fd = semget(KEY, NUM_SEM, IPC_CREAT | perms);
  20.         // если системный вызов прерывается
  21.         if (fd == -1) {
  22.             printf("Ошибка в semget\n");
  23.             return 0;
  24.         }
  25.     }
  26.     union semun {
  27.         // значение семафора
  28.         int val;
  29.         // управляющие параметры набора
  30.         struct semid_ds *buf;
  31.         // массив значений семафора
  32.         ushort *array;
  33.     } arg;
  34.     struct semid_ds buf;
  35.     arg.buf = &buf;
  36.     // определить число семафоров
  37.     if (semctl(fd, 0, IPC_STAT, arg.buf) == -1) {
  38.         printf("Ошибка в 1-ом semctl\n");
  39.         return 0;
  40.     }
  41.     int i, length = arg.buf->sem_nsems;
  42.     // установить значения семафоров
  43.     for (i = 0; i < length; ++i)
  44.         arg.array[i] = 10 * (i + 1);
  45.     // установить все семафоры
  46.     if (semctl(fd, 0, SETALL, arg.array) == -1) {
  47.         printf("Ошибка во 2-ом semctl\n");
  48.         return 0;
  49.     }
  50.     char choice;
  51.     do {
  52.         printf("Вы хотите выйти?\n");
  53.         choice = getchar();
  54.     } while (choice != 'y' && choice != 'Y');
  55.     // удаляется набор семафоров
  56.     if (semctl(fd, 0, IPC_RMID, 0) == -1)
  57.         printf("Ошибка в 3-ем semctl\n");
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement