// // Created by Cigerxwin Chaker on 05.11.19. // #include #include #include #include #include #include #include #include #include #include #include "SharedMemoryAccess.h" /* header is important for the shmID. name could be different. maybe not needed cause: (shmget(memory_access_key, NULL, 0)) */ int initSemaphore (void) { /* Testen, ob das Semaphor bereits existiert */ semId = semget (SEM_KEY, 0, IPC_PRIVATE); if (semId < 0) { /* ... existiert noch nicht, also anlegen */ /* Alle Zugriffsrechte der Dateikreierungsmaske */ /* erlauben */ umask(0); semId = semget (SEM_KEY, 1, IPC_CREAT | IPC_EXCL | PERM); if (semId < 0) { return -1; } /* Semaphor mit 1 initialisieren */ if (semctl (semId, 0, SETVAL, (int) 1) == -1) return -1; } return 1; } int semaphoreOperation (int op) { semaphore.sem_op = op; semaphore.sem_flg = SEM_UNDO; if( semop (semId, &semaphore, 1) == -1) { perror(" semop "); exit (EXIT_FAILURE); } return 1; } void writeToShm(char* text, int size) { int shmId = shmget(memoryAccessKey, NULL, 0); // dont init just get the ID if already existing. if(shmId < 0 ) { exit(EXIT_FAILURE); /* we could return -1, not sure if it will be useful to continue after there is no shm allocated for any reason*/ } else { char *shm_pointer = (char *) shmat(shmId, NULL, 0); semaphoreOperation(LOCK); memcpy(shm_pointer, text, size); semaphoreOperation(UNLOCK); } } char* getShmPointer() { int shmId = shmget(memoryAccessKey, NULL, 0); if(shmId < 0) { exit(EXIT_FAILURE); /* we could return -1, not sure if it will be useful to continue after there is no shm allocated for any reason*/ } else { return (char *) shmat(shmId, NULL, 0); } }