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_buff_id, sem_full_id, sem_free_id, sem_data;
- int sem_readers_id, readers_id, readA_id;
- int seg_size;
- char *buff;
- int loop;
- char letter;
- char alphabet[ALPHABET_SIZE]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u'};
- 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( (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);
- sem_init(sem_data, 1);
- sem_init(sem_free_id, MAX_BUFF);
- sem_init(sem_full_id, 0);
- buff[0] = 0; // w kolejce 0 procesow
- for(loop=0; loop<REP; ++loop){
- if(sem_getVal(sem_data)<=0){
- break;
- }
- letter = alphabet[rand() % ALPHABET_SIZE];
- if(sem_getVal(sem_free_id)>0){
- mutex_wait(buff_id);
- bufferInsert(buff, letter);
- printf("have written: %d to buffer\n", letter);
- sem_change(sem_free_id, -1);
- sem_change(sem_full_id, 1);
- mutex_post(buff_id);
- printf("producent zwalnia\n");
- }
- randSleep1();
- }
- 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);
- sem_deallocate(sem_free_id);
- sem_deallocate(sem_full_id);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement