Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // common.h
- #define MEMORY_KEY 145
- #define SIZE_OF_ARRAY 10
- struct wrapper
- {
- int array[SIZE_OF_ARRAY];
- sem_t empty;
- sem_t pmutex;
- sem_t cmutex;
- sem_t full;
- int n;
- };
- // consumer.c
- #include <semaphore.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include "common.h"
- #include <sys/shm.h>
- int check_prime(int a) {
- return a;
- }
- int memoryID;
- struct wrapper *memory;
- int main() {
- srand(time(NULL));
- key_t sharedMemoryKey = ftok(".",MEMORY_KEY);
- if(sharedMemoryKey==-1)
- {
- perror("ftok():");
- exit(1);
- }
- memoryID=shmget(sharedMemoryKey,sizeof(struct wrapper),0);
- if(memoryID==-1)
- {
- perror("shmget(): ");
- exit(1);
- }
- memory = shmat(memoryID,NULL,0);
- if(memory== (void*)-1)
- {
- perror("shmat():");
- exit(1);
- }
- while(1)
- {
- sem_wait(&memory->full);
- sem_wait(&memory->cmutex);
- int n = memory->n;
- int temp = (memory->array)[n];
- printf("Removed item: %d\tPrime:%d\tNumer of tasks left:%d\n",
- temp, check_prime(temp),n);
- memory->n--;
- usleep(10000);
- sem_post(&memory->cmutex);
- sem_post(&memory->empty);
- }
- }
- // producer.c
- #include <semaphore.h>
- #include <stdio.h>
- #include <errno.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <string.h>
- #include <fcntl.h>
- #include "common.h"
- int memoryID;
- struct wrapper *memory;
- int rc;
- void atexit_function() {
- rc = shmctl(memoryID, IPC_RMID, NULL);
- rc = shmdt(memory);
- sem_destroy(&memory->pmutex);
- sem_destroy(&memory->cmutex);
- sem_destroy(&memory->empty);
- sem_destroy(&memory->full);
- }
- int main() {
- atexit(atexit_function);
- //creating key for shared memory
- srand(time(NULL));
- key_t sharedMemoryKey = ftok(".", MEMORY_KEY);
- if (sharedMemoryKey == -1) {
- perror("ftok():");
- exit(1);
- }
- memoryID = shmget(sharedMemoryKey, sizeof(struct wrapper), IPC_CREAT | 0600);
- if (memoryID == -1) {
- perror("shmget():");
- exit(1);
- }
- memory = shmat(memoryID, NULL, 0);
- if (memory == (void *) -1) {
- perror("shmat():");
- exit(1);
- }
- //initialization
- printf("Initializataion !\n");
- memset(&memory->array, 0, sizeof(memory->array));
- sem_init(&memory->pmutex, 0, 1);
- sem_init(&memory->cmutex, 0, 1);
- sem_init(&memory->empty, 0, SIZE_OF_ARRAY);
- sem_init(&memory->full, 0, 0);
- memory->n = -1;
- if (memoryID == -1) {
- perror("shmget(): ");
- exit(1);
- }
- for (int i = 0; i < 100; ++i)
- {
- int r = rand();
- sem_wait(&memory->empty);
- sem_wait(&memory->pmutex);
- memory->n++;
- (memory->array)[memory->n]=r;
- printf("Adding task\t Value:%d\tNumber of tasks waiting:%d \n",r,memory->n);
- usleep(10000);
- sem_post(&memory->pmutex);
- sem_post(&memory->full);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment