Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <errno.h>
- #include <time.h>
- #include <unistd.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <sys/shm.h>
- #define WIDELEC0 1
- #define WIDELEC1 2
- #define WIDELEC2 3
- #define WIDELEC3 4
- #define WIDELEC4 5
- #define LICZBAFILOZOFOW 5
- #define STANY 3
- int stan[STANY] = { 0, 1, 2} // 0 - stan myslenie // 1 - stan glodu (chec jedzenia) // 2 - stan kiedy je (jedzenie)
- key_t kluczKolejki;
- key_t kluczPamieci;
- int idKolejki;
- int idFilozofa;
- int idPamieci;
- int *widelce;
- struct Wiadomosc
- {
- long typ;
- int wartosc;
- };
- void pokazWidelce()
- {
- int i = 0;
- printf("Tablica widelcow: ");
- for(i = 0; i < LICZBAFILOZOFOW; i++)
- printf("\t%d",widelce[i]);
- printf("\n");
- }
- void myslenie()
- {
- printf("Filozof nr %d sobie mysli ...\n",idFilozofa);
- sleep(1);
- }
- void jedzenie()
- {
- printf("\n--------------------------------\n");
- printf("Filozof nr %d je ...\n",idFilozofa);
- sleep(1);
- pokazWidelce();
- printf("Filozof nr %d skonczyl jesc\n", idFilozofa);
- }
- void test(int k)
- {
- if ( stan[(k - 1) % 5] != 2 && stan[k] = 1 && stan[(k + 1) % 5] != 2 )
- {
- stan[k] = 2;
- msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0);
- }
- }
- int main(int argc, char *argv[])
- {
- srand(time(NULL));
- struct Wiadomosc wiadomosc;
- idFilozofa = atoi(argv[1]);
- int i = 0;
- int prawyWidelec, lewyWidelec;
- if((kluczKolejki=ftok(".",'A')) == -1)
- {
- perror("Nie mozna utworzyc klucza kolejki");
- exit(EXIT_FAILURE);
- }
- if((kluczPamieci=ftok(".",'B')) == -1){
- perror("Nie mozna utworzyc klucza pamieci");
- exit(EXIT_FAILURE);
- }
- if((idKolejki=msgget(kluczKolejki,0666))==-1)
- {
- perror("Nie mozna utworzyc kolejki");
- exit(EXIT_FAILURE);
- }
- if((idPamieci=shmget(kluczPamieci,LICZBAFILOZOFOW*sizeof(int),0666)) == -1)
- {
- perror("Nie mozna utworzyc pamieci dzielonej");
- exit(EXIT_FAILURE);
- }
- if((widelce=(int*)shmat(idPamieci,0,0)) == -1)
- {
- perror("Nie mozna przypisac pamieci dzielonej");
- exit(EXIT_FAILURE);
- }
- for(i = 0; i < 10; i++)
- {
- myslenie();
- name = idFilozofa;
- msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), name, 0);
- stan[name] = 1;
- test(name);
- wiadomosc.typ = ?
- msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0);
- msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), name, 0);
- widelec[name] = 1;
- widelec[(name + 1) % 5] = 1;
- jedzenie();
- widelec[name] = 0;
- widelec[(name + 1) % 5] = 0;
- msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), name, 0);
- stan[name] = 0;
- test((name + 1) % 5);
- test((name - 1) % 5);
- wiadomosc.typ = ?
- pokazWidelce();
- wiadomosc.typ = ?
- msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0);
- }
- }
- // myslenie();
- // lewyWidelec = idFilozofa;
- // prawyWidelec = idFilozofa+1;
- /* if(prawyWidelec == 6) prawyWidelec = 1;
- msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), JADALNIA, 0);
- msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), lewyWidelec, 0);
- msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), prawyWidelec, 0);
- widelce[lewyWidelec-1] = idFilozofa;
- widelce[prawyWidelec-1] = idFilozofa;
- jedzenie();
- widelce[lewyWidelec-1] = 0;
- widelce[prawyWidelec-1] = 0;
- wiadomosc.typ = lewyWidelec;
- msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0);
- wiadomosc.typ = prawyWidelec;
- msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0);
- pokazWidelce();
- wiadomosc.typ = JADALNIA;
- msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0); */
- // procedure filozof;
- // begin
- // repeat
- // myślenie;
- // wait(jadalnia);
- // wait(sem[name]);
- // wait(sem[(name+1)mod 5]);
- // request (widelec[name], widelec[(name+1)mod5]);
- // jedzenie;
- // release(widelec[name], widelec[(name+1)mod5]);
- // signal(sem[name]);
- // signal(sem[(name+1)mod 5]);
- // signal(jadalnia);
- // end
- // end
- // }
- //}
- /*
- procedure filozof;
- begin
- repeat
- myślenie;
- wait(w);
- stan[name]:=1;
- test(name);
- signal(w);
- wait(sem[name]);
- request (widelec[name],widelec[(name+1)mod5]);
- jedzenie;
- release(widelec[name],widelec[(name+1)mod5]);
- wait(w);
- stan[name]:=0;
- test((name+1)mod 5);
- test((name-1)mod 5);
- signal(w)
- end
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement