void shm_init() { sem_t* sem = auv_shm_lock(); bool create = false; // Check if the shm block is valid. int shmid = auv_shm_open(sizeof(struct shm_header), 0666); if (shmid >= 0) { struct shm_header* header = (struct shm_header*)shmat(shmid, 0, 0); bool checksum = strcmp(header->checksum, SHM_CHECKSUM) == 0; bool empty = shm_header_empty(header); shmdt(header); if (!checksum) { if (empty) { shm_rm(shmid); create = true; } else { sem_post(sem); puts("shm versions do not match. Please restart all shm clients."); abort(); } } } else { create = true; } // Connect to shared memory. shmid = auv_shm_open(sizeof(struct shm), IPC_CREAT|0666); shm = (struct shm*)shmat(shmid, 0, 0); if (shm <= 0) { shm_rm(shmid); sem_post(sem); puts("Failed to connect to shared memory."); abort(); } // Initialize everything if we created a new file. if (create) { shm_init_vars(); } // Mark ourselves as using the shm file. connect(&shm->header); sem_post(sem); }
static void shm_close(void *addr) { shm_detach(addr); shm_rm(); }
int main() { int bufferFilledSpaces, bufferEmptySpaces, semM, semN; char *buffer; int temp; int shmid; char c1, c2; int input = 0; int counter; char *arg[1] = {0}; int N; // Create duplicate process and give it code from ProcN N = fork(); if (N == 0) // process is a child { execv("ProcN", arg); } // Create semaphore bufferFilledSpaces bufferFilledSpaces = sem_create(155555, 0); if (bufferFilledSpaces < 0) { Error(1); // Error has occurred } // Create semaphore bufferEmptySpaces bufferEmptySpaces = sem_create(255555, 1); if (bufferEmptySpaces < 0) { Error(1); // Error has occurred } // Creates synchronization semaphores semM = sem_create(355555, 0); if (semM < 0) { Error(1); // Error has occurred } // Creates synchronization semaphores semN = sem_create(455555, 0); if (semN < 0) { Error(1); // Error has occurred } // Opens shared memory between two processes shmid = shm_get(123123, (void*) &buffer, 90); // Synchronization with Process N temp = sem_signal(semN); temp = sem_wait(semM); // Part 1 - Fill in initial values c1 = 'a'; c2 = '0'; counter = 1; while (counter <= 260) { temp = sem_wait(bufferEmptySpaces); buffer[input] = c1; buffer[input+1] = c2; buffer[input+2] = c1; //Debug //printf("# %c%c%c #", c1, c2, c1); if ((counter % 26) == 0) // Increment number if needed { c2++; c1 = 'a'; } else // Otherwise, move to next letter in alphabet { c1++; } counter++; temp = sem_signal(bufferFilledSpaces); } // Part 2 - Fill in initial values c1 = 'A'; c2 = '0'; counter = 1; while (counter <= 260) { temp = sem_wait(bufferEmptySpaces); buffer[input] = c1; buffer[input+1] = c2; buffer[input+2] = c1; //Debug //printf("# %c%c%c #", c1, c2, c1); if ((counter % 26) == 0) // Increment number if needed { c2++; c1 = 'A'; } else // Otherwise, move to next letter in alphabet { c1++; } counter++; temp = sem_signal(bufferFilledSpaces); } // Synchronization with Process N temp = sem_signal(semN); temp = sem_wait(semM); // Remove semaphores temp = sem_rm(bufferEmptySpaces); temp = sem_rm(bufferFilledSpaces); temp = sem_rm(semM); temp = sem_rm(semN); // Remove shared memory temp = shm_rm(shmid); printf("\n"); return 1; }
int main() { int *BufferA; int *BufferB; char c1, c2, c3; int bufAFilled, bufAEmpty, bufBFilled, bufBEmpty; int semX, semY, semZ, CSX, CSY, CSZ; int pX, pY; char *arg[1] = {0}; int shmid1, shmid2; int temp, loop_finished, counter, input; // Create semaphore bufAFilled bufAFilled = sem_create(500001, 0); if (bufAFilled < 0) { Error(1); // Error has occurred } // Create semaphore bufAEmpty bufAEmpty = sem_create(500002, 11); if (bufAEmpty < 0) { Error(1); // Error has occurred } // Create semaphore bufBFilled bufBFilled = sem_create(500003, 0); if (bufBFilled < 0) { Error(1); // Error has occurred } // Create semaphore bufBEmpty bufBEmpty = sem_create(500004, 23); if (bufBEmpty < 0) { Error(1); // Error has occurred } // Create semaphore semX semX = sem_create(500005, 0); if (semX < 0) { Error(1); // Error has occurred } // Create semaphore semY semY = sem_create(500006, 0); if (semY < 0) { Error(1); // Error has occurred } // Create semaphore semZ semZ = sem_create(500007, 0); if (semZ < 0) { Error(1); // Error has occurred } // Create semaphore CSX CSX = sem_create(500008, 0); if (CSX < 0) { Error(1); // Error has occurred } // Create semaphore CSY CSY = sem_create(500009, 0); if (CSY < 0) { Error(1); // Error has occurred } // Create semaphore CSZ CSZ = sem_create(500010, 0); if (CSZ < 0) { Error(1); // Error has occurred } // Opens shared memory between two processes shmid1 = shm_get(900001, (void*) &BufferA, 22); // Opens shared memory between two processes shmid2 = shm_get(900002, (void*) &BufferB, 69); // Create duplicate processes and give them code for processes X and Y pX = fork(); if (pX == 0) // process is a child { execv("ProcX", arg); } pY = fork(); if (pY == 0) // process is a child { execv("ProcY", arg); } // Synchronize with ProcX and ProcY temp = sem_signal(semX); temp = sem_signal(semY); temp = sem_wait(semZ); temp = sem_wait(semZ); // Take out items from buffers when elements exist counter = 1; input = 0; while (counter <= 260) { // Wait until both of the buffers have been filled temp = sem_wait(CSZ); temp = sem_wait(CSZ); // Remove one item from BufferA when one exists temp = sem_wait(bufAFilled); c1 = BufferA[input*2]; c2 = BufferA[input*2+1]; printf("+ %c%c +", c1, c2); temp = sem_signal(bufAEmpty); // Remove one item from BufferB when one exists temp = sem_wait(bufBFilled); c1 = BufferB[input*3]; c2 = BufferB[input*3+1]; c3 = BufferB[input*3+2]; printf("+ %c%c%c +", c1, c2, c3); temp = sem_signal(bufBEmpty); if ((counter % 160) == 0) // Sleep after taking every 160 items { // printf("-!Sleeping 3 seconds!-"); // sleep(3); } counter++; // Signal the commencement of the filling both the buffers temp = sem_signal(CSX); temp = sem_signal(CSY); } // Synchronize with ProcX and ProcY temp = sem_signal(semX); temp = sem_signal(semY); temp = sem_wait(semZ); temp = sem_wait(semZ); // sleep(7); printf("\n"); // Remove semaphores temp = sem_rm(bufAEmpty); temp = sem_rm(bufAFilled); temp = sem_rm(bufBEmpty); temp = sem_rm(bufBFilled); temp = sem_rm(semX); temp = sem_rm(semY); temp = sem_rm(semZ); temp = sem_rm(CSX); temp = sem_rm(CSY); temp = sem_rm(CSZ); // Remove shared memory temp = shm_rm(shmid1); temp = shm_rm(shmid2); printf("\nProcZ: Exiting...\n"); return 1; }