ivorakitin

IPC SystemV Semaphores

Dec 17th, 2025
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.34 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/wait.h>
  4. #include <sys/ipc.h>
  5. #include <sys/shm.h>
  6. #include <stdlib.h>
  7. #include <sys/sem.h>
  8. #include <time.h>
  9. #define SHMSIZE 1
  10.  
  11. union semun
  12. {
  13.     int val;
  14.     struct semid_ds *buf;
  15.     unsigned short *array;
  16. };
  17.  
  18. int main()
  19. {
  20.     pid_t pid;
  21.     key_t key;
  22.     char *buff;
  23.     int shmid;
  24.     char symbol;
  25.     int semid;
  26.     key = ftok(".", 1);
  27.     semid = semget(key, 2, IPC_CREAT | 0755);
  28.     union semun un;
  29.     unsigned short arr[2] = { 1, 0 };
  30.     un.array = arr;
  31.     semctl(semid, 0, SETALL, un);
  32.  
  33.     struct sembuf popProduce;
  34.     popProduce.sem_num = 0;
  35.     popProduce.sem_op = -1;
  36.     popProduce.sem_flg = 0;
  37.    
  38.     struct sembuf vopProduce;
  39.     vopProduce.sem_num = 0;
  40.     vopProduce.sem_op = 1;
  41.     vopProduce.sem_flg = 0;
  42.    
  43.     struct sembuf popConsume;
  44.     popConsume.sem_num = 1;
  45.     popConsume.sem_op = -1;
  46.     popConsume.sem_flg = 0;
  47.    
  48.     struct sembuf vopConsume;
  49.     vopConsume.sem_num = 1;
  50.     vopConsume.sem_op = 1;
  51.     vopConsume.sem_flg = 0;
  52.    
  53.     pid = fork();
  54.    
  55.     if (pid == -1)
  56.     {
  57.         perror("fork");
  58.         exit(EXIT_FAILURE);
  59.     }
  60.     else if (pid == 0)
  61.     {
  62.         shmid = shmget(key, SHMSIZE, IPC_CREAT | 0755);
  63.         buff = shmat(shmid, NULL, 0);
  64.         for (symbol = 'a'; symbol <= 'z'; symbol++)
  65.         {
  66.             int i = (rand() % (20000 - 1000 + 1)) + 1000;
  67.             int j = (rand() % (20000 - 1000 + 1)) + 1000;
  68.             semop(semid, &popProduce, 1);
  69.             usleep(i);
  70.             *buff = symbol;
  71.             usleep(j);
  72.             semop(semid, &vopConsume, 1);
  73.         }
  74.         shmdt(buff);
  75.     }
  76.     else if (pid > 0)
  77.     {
  78.         int i;
  79.         shmid = shmget(key, SHMSIZE, IPC_CREAT | 0755);
  80.         buff = shmat(shmid, 0, 0);
  81.         for (i = 0; i <= 'z' - 'a'; i++)
  82.         {
  83.             int i = (rand() % (20000 - 1000 + 1)) + 1000;
  84.             int j = (rand() % (20000 - 1000 + 1)) + 1000;
  85.             semop(semid, &popConsume, 1);
  86.             usleep(i);
  87.             symbol = *buff;
  88.             printf("Received symbol: %c\n", symbol);
  89.             usleep(j);
  90.             semop(semid, &vopProduce, 1);
  91.         }
  92.         shmdt(buff);
  93.         wait(NULL);
  94.         shmctl(shmid, IPC_RMID, NULL);
  95.         semctl(semid, 0, IPC_RMID, NULL);
  96.     }
  97.     return 0;
  98. }
  99.  
Advertisement
Add Comment
Please, Sign In to add comment