From dc5c983dd7582ba9d10c4172949eaa424786cb2c Mon Sep 17 00:00:00 2001 From: bartfaik04 Date: Sat, 31 May 2025 13:00:34 +0200 Subject: [PATCH] Guarder protected with semaphor --- src/guarder.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/guarder.h b/src/guarder.h index 00774dd..3579548 100644 --- a/src/guarder.h +++ b/src/guarder.h @@ -4,20 +4,33 @@ #include #include #include +#include +#include class guarder{ private: const int shmid; + const int semid; + + void semaphoreOp(int op) { + struct sembuf sb{}; + sb.sem_num = 0; + sb.sem_op = op; + sb.sem_flg = 0; + semop(semid, &sb, 1); + } void setFlag(bool value) { + semaphoreOp(-1); bool *flag = static_cast(shmat(shmid, nullptr, 0)); *flag = value; shmdt(flag); + semaphoreOp(1); } public: - guarder() : shmid(shmget(IPC_PRIVATE, sizeof(bool), 0666 | IPC_CREAT)) + guarder() : shmid(shmget(IPC_PRIVATE, sizeof(bool), 0666 | IPC_CREAT)), semid(semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT)) { setFlagOff(); } @@ -34,15 +47,18 @@ public: bool isFlagOn() { + semaphoreOp(-1); bool *flag = static_cast(shmat(shmid, nullptr, 0)); bool ret = *flag; shmdt(flag); + semaphoreOp(1); return ret; } ~guarder() { shmctl(shmid, IPC_RMID, nullptr); + semctl(semid, 0, IPC_RMID); } }; -- 2.49.1