fork download
  1. #include <iostream>
  2. #include <sys/ipc.h>
  3. #include <sys/shm.h>
  4. #include <sys/types.h>
  5. #include <semaphore.h>
  6. #include <fcntl.h>
  7. #include <unistd.h>
  8.  
  9. #define SHM_SIZE 1024 // Shared memory size
  10.  
  11. struct SharedMemory {
  12. sem_t mutex;
  13. sem_t full;
  14. sem_t empty;
  15. int buffer;
  16. };
  17.  
  18. void producer() {
  19. key_t key = ftok("shmfile", 65);
  20. int shmid = shmget(key, sizeof(SharedMemory), 0666 | IPC_CREAT);
  21. SharedMemory* shm = (SharedMemory*)shmat(shmid, nullptr, 0);
  22.  
  23. sem_init(&shm->mutex, 1, 1);
  24. sem_init(&shm->full, 1, 0);
  25. sem_init(&shm->empty, 1, 1);
  26.  
  27. for (int i = 1; i <= 5; ++i) {
  28. sem_wait(&shm->empty);
  29. sem_wait(&shm->mutex);
  30.  
  31. shm->buffer = i;
  32. std::cout << "Produced: " << i << std::endl;
  33.  
  34. sem_post(&shm->mutex);
  35. sem_post(&shm->full);
  36. sleep(1);
  37. }
  38. }
  39.  
  40. void consumer() {
  41. key_t key = ftok("shmfile", 65);
  42. int shmid = shmget(key, sizeof(SharedMemory), 0666 | IPC_CREAT);
  43. SharedMemory* shm = (SharedMemory*)shmat(shmid, nullptr, 0);
  44.  
  45. for (int i = 1; i <= 5; ++i) {
  46. sem_wait(&shm->full);
  47. sem_wait(&shm->mutex);
  48.  
  49. int data = shm->buffer;
  50. std::cout << "Consumed: " << data << std::endl;
  51.  
  52. sem_post(&shm->mutex);
  53. sem_post(&shm->empty);
  54. sleep(1);
  55. }
  56.  
  57. sem_destroy(&shm->mutex);
  58. sem_destroy(&shm->full);
  59. sem_destroy(&shm->empty);
  60. shmctl(shmid, IPC_RMID, nullptr);
  61. }
  62.  
  63. int main() {
  64. pid_t pid = fork();
  65. if (pid > 0) {
  66. producer();
  67. } else {
  68. consumer();
  69. }
  70. return 0;
  71. }
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Produced: 1
Consumed: 1
Produced: 2
Consumed: 2
Produced: 3
Consumed: 3
Produced: 4
Consumed: 4
Produced: 5
Consumed: 5