Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/shm.h>
- #include <sys/stat.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <sys/time.h>
- #include <sys/resource.h>
- #include <time.h>
- #include <math.h>
- #include "sem.h"
- #include "keys.h"
- int main(int argc, char* argv[]){
- int buff_id, sem_full_id, sem_free_id, sem_data;
- int sem_readers_id, sem_readA_id, sem_readB_id, mutex_readers;
- int seg_size;
- char *buff;
- int loop;
- char letter;
- seg_size=(1+MAX_BUFF)*sizeof(char);
- buff_id=shmget(buff_key, seg_size, 0666| IPC_CREAT);
- if(buff_id<0){
- printf("shmget error");
- exit(1);
- }
- buff=(char*)shmat(buff_id, 0, 0);
- if( (sem_readA_id = sem_allocate(sem_readA_key , 0666 | IPC_CREAT)) < 0) exit(1);
- if( (mutex_readers = mutex_allocate(mutex_readers_key, 0666 | IPC_CREAT)) < 0) exit(1);
- if( (sem_readB_id = sem_allocate(sem_readB_key , 0666 | IPC_CREAT)) < 0) exit(1);
- if( (sem_readers_id = sem_allocate(sem_readers_key , 0666 | IPC_CREAT)) < 0) exit(1);
- if( (buff_id = mutex_allocate(sem_buff_key, 0666 | IPC_CREAT)) < 0) exit(1);
- if( (sem_data = sem_allocate(sem_data_key, 0666 | IPC_CREAT)) < 0) exit(1);
- if( (sem_free_id = sem_allocate(free_key, 0666 | IPC_CREAT)) < 0) exit(1);
- if( (sem_full_id = sem_allocate(full_key, 0666 | IPC_CREAT)) < 0) exit(1);
- mutex_init(buff_id);
- mutex_init(mutex_readers);
- sem_init(sem_readA_id, 1);
- sem_init(sem_readB_id, 1);
- sem_init(sem_readers_id, 0);
- sem_init(sem_data, 1);
- sem_init(sem_free_id, MAX_BUFF);
- sem_init(sem_full_id, 0);
- for(;;){
- if(sem_getVal(sem_data)<=0){
- break;
- }
- //jest wiadomosc ?
- //czekaj az z queue mozna bedzie czytac
- mutex_wait(sem_full_id);
- printf("readerA dead");
- mutex_wait(sem_readA_id);
- mutex_wait(buff_id);
- letter = bufferGet(buff); //pobierz wiadomosc ale nie zdejmu
- printf("read: %d \n", letter);
- sem_change(sem_readA_id, -1);
- sem_change(sem_readers_id, 1);
- mutex_post(buff_id);
- //wyjdz z sekcji krytycznej
- randSleep2();
- }
- // powiedz innym aby break;
- union semun arg;
- arg.val = 0;
- semctl(sem_data, 0, SETVAL, arg);
- // wyłączamy segment pamięci wspólnej
- shmdt(buff);
- mutex_deallocate(buff_id);
- mutex_deallocate(sem_readA_id);
- mutex_deallocate(sem_readers_id);
- mutex_deallocate(mutex_readers);
- sem_deallocate(sem_free_id);
- sem_deallocate(sem_full_id);
- sem_deallocate(sem_data);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement