Advertisement
PaulPaulAga

Untitled

Jan 13th, 2021
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.15 KB | None | 0 0
  1. /*
  2.  * Напсиать программу, реализующую задачу "Производство потребление"
  3.  * по алгоритму Э. Дейкстры с тремя семафорами: двумя считающими и ъодним бинарным.
  4.  *
  5.  * В программе надо обесмпечить случайные задержки  выполнения созданных
  6.  * процессов.
  7.  *
  8.  * В программе для взаимодействия производиттелей и
  9.  * потребителей буфер создается в разделямом сгементе.
  10.  *
  11.  * Обратите внимание на то, чтобы не рабтоать с одиночной перемнной,
  12.  * а работать именно с буфером, состоящим из N ячеек, по алгоритму.
  13.  *
  14.  * Производитлеи в ячейки буфера записывают буквы алфамита по порядку.
  15.  *
  16.  * Потребители считывают символы из
  17.  * считывания буквы из ячейки следуюзий потребитель может взять букву из следующей ячейки
  18.  */
  19.  
  20. #include <sys/types.h>
  21. #include <sys/ipc.h>
  22. #include <sys/sem.h>
  23. #include <sys/stat.h>
  24. #include <sys/shm.h>
  25. #include <unistd.h>
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28.  
  29. const int MY_FLAG = IPC_CREAT | S_URWXU | S_IRWXG | S_IRWXO;
  30. const int num = 10;
  31. const int count = 15;
  32.  
  33. int *buf;
  34. int *pos;
  35.  
  36. #define PROD    (0)
  37. #define CONS    (1)
  38. #define BIN     (2)
  39.  
  40. struct sembuf start_produce[2]  = {{PROD, -1, 0}    ,{BIN, -1, 0}};
  41. struct sembuf stop_produce[2]   = {{PROD, 1, 0}     ,{BIN, 1, 0}};
  42. struct sembuf start_consume[2]  = {{CONS, -1,0}     ,{BIN, -1, 0}};
  43. struct sembuf stop_consume[2]   = {{CONS, 1,0}      ,{BIN, 1, 0}};
  44.  
  45. // ???????????
  46. int main() {
  47.     key_t mem_key;
  48.     my_key = ftok("my_file", 0);
  49.     int shmid, semid, status;
  50.  
  51.     if ((shmid = shmget(mem_key, (num + 1) * sizeof(int), MY_FLAG)) == -1) {
  52.         perror("shmget error");
  53.         exit(1);
  54.     }
  55.  
  56.     pos = shmat(shmid, 0, 0);
  57.     buf = pos + sizeof(int);
  58.  
  59.     (*pos) = 0;
  60.     if (*buf == -1) {
  61.         perror("shmat error");
  62.         exit(1);
  63.     }
  64.  
  65.     if ((semid = semget(my_key, 3, MY_FLAG)) == -1) {
  66.         perror("semget error");
  67.         exit(1);
  68.     }
  69.  
  70.     if ((semid = semget(my_key, 3, MY_FLAG)) == -1) {
  71.         perror("semget error");
  72.         exit(1);
  73.     }
  74.    
  75.     semctl(semid, 2, SETVAL, 0);
  76.     semctl(semid, 1, SETVAL, num);
  77.     semctl(semid, 2, SETVAL, 1);
  78.  
  79.     srand(time(NULL));
  80.  
  81.     pid_t pid;
  82.  
  83.     if ((pid = fork()) == -1) {
  84.         perror("Can't fork()");
  85.         exit(1);
  86.     }
  87.  
  88.     int k = 0;
  89.     if (pid == 0) {
  90.             while (k < count) {
  91.                 semop(semid, start_pr, 2);
  92.                 buf[*pos] = 1 + rand() % 10;
  93.                 printf("\tProduction^[%d] -- [%d]\n", k, buf[*pos]);
  94.                 (*pos)++;
  95.                 semop(semid, stop_pr, 2);
  96.                 sleep(rand() % 2);
  97.                 k++;
  98.             }
  99.     } else {
  100.         while (k < count) {
  101.             semop(semid, start_po, 2);
  102.             (*pos)--;
  103.             printf("Consumption^ [%d] -- [%d]\n", k, buf[*pos]);
  104.             sleep(rand() % 2);
  105.             k++;
  106.         }
  107.     }
  108.     if (pid != 0) {
  109.         if (shmdt(pos) == -1) {
  110.             perror("shmdt error");
  111.             exit(1);
  112.         }
  113.     }
  114.  
  115.     return 0;
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement