#ifndef _GUARDER_H #define _GUARDER_H #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)), semid(semget(IPC_PRIVATE, 1, 0666 | IPC_CREAT)) { setFlagOff(); } void setFlagOff() { setFlag(false); } void setFlagOn() { setFlag(true); } 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); } }; #endif // _GUARDER_H