Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <unistd.h>
- #include <stdio.h>
- #include <semaphore.h>
- #include <stdlib.h>
- #include "lib.h"
- #include <sys/wait.h>
- /**
- *Problem je Citatel/Zapisovatel
- *Citatel=Monitor
- *Zapisovatel=Cidlo
- signa=0
- turniket=1
- ko =1
- mutex mon =1
- mutex_cidlo=1
- * Monitor Cidlo
- signal.wait signal.post
- turniket.wait
- turniket.post
- * mutex_mon.wait mutex_cidlo.wait
- mon++ cidlo++
- if mon = 1
- turniket.wait if cidlo=1
- KO.lock KO.lock
- * mutex_mon.unlock mutex_cidlo.unlock
- * read.. data write data..
- * mutex_mon.wait mutex_cidlo.lock
- cidlo--
- mon-- if cidlo == 0
- if mon ==0
- turniket.unlock KO.unlock
- KO.unlock
- * mutex_mon.signal mutex_cidlo.unlock
- */
- typedef struct data_struct {
- sem_t mutex_mon;
- sem_t mutex_cidlo;
- sem_t ko;
- sem_t turniket;
- sem_t signal;
- int cidlo;
- int monitor;
- } DATA;
- DATA * data;
- void lightswitch_lock_mon(){
- if(sem_wait(&data->mutex_mon)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- data->monitor++;
- if (data->monitor == 1){
- if(sem_wait(&data->turniket)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- if(sem_wait(&data->ko)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- }
- if(sem_post(&data->mutex_mon)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- }
- void lightswitch_unlock_mon(){
- if(sem_wait(&data->mutex_mon)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- data->monitor--;
- if (data->monitor == 0){
- if(sem_post(&data->turniket)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- if(sem_post(&data->ko)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- }
- if(sem_post(&data->mutex_mon)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- }
- void lightswitch_lock_cid(){
- if(sem_wait(&data->mutex_cidlo)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- data->cidlo++;
- if (data->cidlo == 1){
- if(sem_wait(&data->ko)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- }
- if(sem_post(&data->mutex_cidlo)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- }
- void lightswitch_unlock_cid(){
- if(sem_wait(&data->mutex_cidlo)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- data->cidlo--;
- if (data->cidlo == 0){
- if(sem_post(&data->ko)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- }
- if(sem_post(&data->mutex_cidlo)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- }
- void monitor(int monitor){
- while(1){
- usleep(500);
- if(sem_wait(&data->signal)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- lightswitch_lock_mon();
- if(sem_wait(&data->mutex_mon)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- printf("monit %02d: pocet_citajucich_monitorov=%02d\n",monitor,data->monitor);
- usleep(rand()%200);
- if(sem_post(&data->mutex_mon)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- lightswitch_unlock_mon();
- }
- }
- void cidlo(int cidlo){
- while(1){
- if(sem_post(&data->signal)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- if(sem_wait(&data->turniket)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- if(sem_post(&data->turniket)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- lightswitch_lock_cid();
- if(sem_wait(&data->mutex_cidlo)){
- fprintf(stderr,"nepodarilo sa zamknut sem");
- }
- int rand_num=rand()%6+10;
- printf("cidlo %02d: pocet_zapisujucich_cidiel=%02d, trvanie_zapisu=%03d\n", cidlo,data->cidlo,rand_num);
- usleep(rand_num);
- if(sem_post(&data->mutex_cidlo)){
- fprintf(stderr,"nepodarilo sa odomknut sem");
- }
- lightswitch_unlock_cid();
- }
- }
- int main(){
- data = (DATA*) malloc_shared(sizeof(DATA));
- if(data== NULL){
- fprintf(stderr,"Chyba vo vytvarani zdielanej pamate");
- }
- int pocet_cidiel=11;
- int i=0;
- pid_t pid;
- data->cidlo=0;
- data->monitor=0;
- if(sem_init(&data->mutex_cidlo,1,1)){
- fprintf(stderr,"Chyba vo vytvarani semaforu");
- }
- if(sem_init(&data->mutex_mon,1,1)){
- fprintf(stderr,"Chyba vo vytvarani semaforu");
- }
- if(sem_init(&data->ko,1,1)){
- fprintf(stderr,"Chyba vo vytvarani semaforu");
- }
- if(sem_init(&data->signal,1,0)){
- fprintf(stderr,"Chyba vo vytvarani semaforu");
- }
- if(sem_init(&data->turniket,1,1)){
- fprintf(stderr,"Chyba vo vytvarani semaforu");
- }
- printf ("pocet cidiel : %d \n",pocet_cidiel);
- for(i=0;i<pocet_cidiel;i++){
- pid=fork();
- switch(pid){
- case 0:
- cidlo(i);
- exit(EXIT_SUCCESS);
- break;
- case -1:
- fprintf(stderr,"Chyba vo vytvarani procesu");
- exit(EXIT_FAILURE);
- default:
- continue;
- }
- }
- printf("V PICI SOM TU\n");
- int pocet_monitorov=2;
- for(i=0;i<pocet_monitorov;i++){
- pid=fork();
- switch(pid){
- case 0:
- monitor(i);
- exit(EXIT_SUCCESS);
- break;
- case -1:
- fprintf(stderr,"Chyba vo vytvarani procesu");
- exit(EXIT_FAILURE);
- default:
- continue;
- }
- }
- for(i=0;i<pocet_monitorov+pocet_cidiel;i++){
- wait(NULL);
- }
- free_shared(data);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement