#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <semaphore.h>
#include <fcntl.h>
#include <unistd.h>
#define SHM_SIZE 1024 // Shared memory size
struct SharedMemory {
sem_t mutex;
sem_t full;
sem_t empty;
int buffer;
};
void producer() {
key_t key = ftok("shmfile", 65);
int shmid = shmget(key, sizeof(SharedMemory), 0666 | IPC_CREAT);
SharedMemory* shm = (SharedMemory*)shmat(shmid, nullptr, 0);
sem_init(&shm->mutex, 1, 1);
sem_init(&shm->full, 1, 0);
sem_init(&shm->empty, 1, 1);
for (int i = 1; i <= 5; ++i) {
sem_wait(&shm->empty);
sem_wait(&shm->mutex);
shm->buffer = i;
std::cout << "Produced: " << i << std::endl;
sem_post(&shm->mutex);
sem_post(&shm->full);
sleep(1);
}
}
void consumer() {
key_t key = ftok("shmfile", 65);
int shmid = shmget(key, sizeof(SharedMemory), 0666 | IPC_CREAT);
SharedMemory* shm = (SharedMemory*)shmat(shmid, nullptr, 0);
for (int i = 1; i <= 5; ++i) {
sem_wait(&shm->full);
sem_wait(&shm->mutex);
int data = shm->buffer;
std::cout << "Consumed: " << data << std::endl;
sem_post(&shm->mutex);
sem_post(&shm->empty);
sleep(1);
}
sem_destroy(&shm->mutex);
sem_destroy(&shm->full);
sem_destroy(&shm->empty);
shmctl(shmid, IPC_RMID, nullptr);
}
int main() {
pid_t pid = fork();
if (pid > 0) {
producer();
} else {
consumer();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3lzL2lwYy5oPgojaW5jbHVkZSA8c3lzL3NobS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNkZWZpbmUgU0hNX1NJWkUgMTAyNCAgLy8gU2hhcmVkIG1lbW9yeSBzaXplCgpzdHJ1Y3QgU2hhcmVkTWVtb3J5IHsKICAgIHNlbV90IG11dGV4OwogICAgc2VtX3QgZnVsbDsKICAgIHNlbV90IGVtcHR5OwogICAgaW50IGJ1ZmZlcjsKfTsKCnZvaWQgcHJvZHVjZXIoKSB7CiAgICBrZXlfdCBrZXkgPSBmdG9rKCJzaG1maWxlIiwgNjUpOwogICAgaW50IHNobWlkID0gc2htZ2V0KGtleSwgc2l6ZW9mKFNoYXJlZE1lbW9yeSksIDA2NjYgfCBJUENfQ1JFQVQpOwogICAgU2hhcmVkTWVtb3J5KiBzaG0gPSAoU2hhcmVkTWVtb3J5KilzaG1hdChzaG1pZCwgbnVsbHB0ciwgMCk7CgogICAgc2VtX2luaXQoJnNobS0+bXV0ZXgsIDEsIDEpOwogICAgc2VtX2luaXQoJnNobS0+ZnVsbCwgMSwgMCk7CiAgICBzZW1faW5pdCgmc2htLT5lbXB0eSwgMSwgMSk7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gNTsgKytpKSB7CiAgICAgICAgc2VtX3dhaXQoJnNobS0+ZW1wdHkpOwogICAgICAgIHNlbV93YWl0KCZzaG0tPm11dGV4KTsKCiAgICAgICAgc2htLT5idWZmZXIgPSBpOwogICAgICAgIHN0ZDo6Y291dCA8PCAiUHJvZHVjZWQ6ICIgPDwgaSA8PCBzdGQ6OmVuZGw7CgogICAgICAgIHNlbV9wb3N0KCZzaG0tPm11dGV4KTsKICAgICAgICBzZW1fcG9zdCgmc2htLT5mdWxsKTsKICAgICAgICBzbGVlcCgxKTsKICAgIH0KfQoKdm9pZCBjb25zdW1lcigpIHsKICAgIGtleV90IGtleSA9IGZ0b2soInNobWZpbGUiLCA2NSk7CiAgICBpbnQgc2htaWQgPSBzaG1nZXQoa2V5LCBzaXplb2YoU2hhcmVkTWVtb3J5KSwgMDY2NiB8IElQQ19DUkVBVCk7CiAgICBTaGFyZWRNZW1vcnkqIHNobSA9IChTaGFyZWRNZW1vcnkqKXNobWF0KHNobWlkLCBudWxscHRyLCAwKTsKCiAgICBmb3IgKGludCBpID0gMTsgaSA8PSA1OyArK2kpIHsKICAgICAgICBzZW1fd2FpdCgmc2htLT5mdWxsKTsKICAgICAgICBzZW1fd2FpdCgmc2htLT5tdXRleCk7CgogICAgICAgIGludCBkYXRhID0gc2htLT5idWZmZXI7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJDb25zdW1lZDogIiA8PCBkYXRhIDw8IHN0ZDo6ZW5kbDsKCiAgICAgICAgc2VtX3Bvc3QoJnNobS0+bXV0ZXgpOwogICAgICAgIHNlbV9wb3N0KCZzaG0tPmVtcHR5KTsKICAgICAgICBzbGVlcCgxKTsKICAgIH0KCiAgICBzZW1fZGVzdHJveSgmc2htLT5tdXRleCk7CiAgICBzZW1fZGVzdHJveSgmc2htLT5mdWxsKTsKICAgIHNlbV9kZXN0cm95KCZzaG0tPmVtcHR5KTsKICAgIHNobWN0bChzaG1pZCwgSVBDX1JNSUQsIG51bGxwdHIpOwp9CgppbnQgbWFpbigpIHsKICAgIHBpZF90IHBpZCA9IGZvcmsoKTsKICAgIGlmIChwaWQgPiAwKSB7CiAgICAgICAgcHJvZHVjZXIoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY29uc3VtZXIoKTsKICAgIH0KICAgIHJldHVybiAwOwp9