ivorakitin

IPC SystemV Semaphores

Dec 17th, 2025
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/ipc.h>
  4. #include <sys/sem.h>
  5. #include <sys/shm.h>
  6. #include <sys/types.h>
  7. #include <unistd.h>
  8. #include <sys/wait.h>
  9.  
  10. /* semctl union */
  11. union semun
  12. {
  13.     int val;
  14.     struct semid_ds *buf;
  15.     unsigned short *array;
  16. };
  17.  
  18. void sem_wait(int semid)
  19. {
  20.     struct sembuf sb = {0, -1, 0};
  21.     semop(semid, &sb, 1);
  22. }
  23.  
  24. void sem_signal(int semid)
  25. {
  26.     struct sembuf sb = {0, +1, 0};
  27.     semop(semid, &sb, 1);
  28. }
  29.  
  30. int main()
  31. {
  32.     key_t key = ftok(".", 75);
  33.  
  34.     /* Shared memory */
  35.     int shmid = shmget(key, sizeof(int), 0666 | IPC_CREAT);
  36.     int *counter = (int *)shmat(shmid, NULL, 0);
  37.     *counter = 0;
  38.  
  39.     /* Semaphore */
  40.     int semid = semget(key, 1, 0666 | IPC_CREAT);
  41.     union semun arg;
  42.     arg.val = 1;   // mutex
  43.     semctl(semid, 0, SETVAL, arg);
  44.     pid_t pid = fork();
  45.     if (pid == 0)
  46.     {
  47.         /* Child */
  48.         for (int i = 0; i < 5; i++)
  49.         {
  50.             sem_wait(semid);
  51.             (*counter)++;
  52.             printf("Child incremented counter to %d\n", *counter);
  53.             sem_signal(semid);
  54.             sleep(1);
  55.         }
  56.         exit(0);
  57.     }
  58.     else if (pid > 0)
  59.     {
  60.         /* Parent */
  61.         for (int i = 0; i < 5; i++)
  62.         {
  63.             sem_wait(semid);
  64.             (*counter)++;
  65.             printf("Parent incremented counter to %d\n", *counter);
  66.             sem_signal(semid);
  67.             sleep(1);
  68.         }
  69.  
  70.         wait(NULL);
  71.  
  72.         /* Cleanup */
  73.         shmdt(counter);
  74.         shmctl(shmid, IPC_RMID, NULL);
  75.         semctl(semid, 0, IPC_RMID);
  76.     }
  77.  
  78.     return 0;
  79. }
  80.  
Advertisement
Add Comment
Please, Sign In to add comment