Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <sys/shm.h>
- struct komunikat{
- long mtype;
- char tresc[2];
- };
- int main (void){
- int i;
- key_t MSGkey, SHMkey;
- int MSGid, SHMid;
- char *widelce;
- char numer_filozofa[2];
- struct komunikat kom;
- char najedzeni=0;
- // tworzymy klucz kolejki komunikatów
- if ((MSGkey = ftok(".", '*'))==-1){
- printf("blad utworzenia klucza kolejki komunikatow.\n");
- exit(1);
- }
- // tworzymy klucz pamięci współdzielonej
- if ((SHMkey = ftok(".", ')'))==-1){
- printf("blad utworzenia klucza pamieci wspoldzielonej.\n");
- exit(1);
- }
- // tworzymy kolejkę komunikatów
- if((MSGid = msgget(MSGkey,IPC_CREAT|IPC_EXCL|0660))==-1){
- printf("blad utworzenia kolejki komunikatow.\n");
- exit(1);
- }
- // tworzymy pamięć współdzieloną
- if((SHMid = shmget(SHMkey, 5*sizeof(char), IPC_CREAT|IPC_EXCL|0660))==-1){
- printf("blad utworzenia obszaru pamieci wspoldzielonej.\n");
- exit(1);
- }
- // dołączamy segment pamięci
- widelce = (char*) shmat(SHMid, NULL, 0);
- if(*widelce==-1){
- printf("blad przydzielenia segmentu pamieci.\n");
- exit(1);
- }
- // zerujemy tablicę widelców
- for(i=0; i<5; i++){
- widelce[i]=0;
- }
- // otwieramy procesy filozofów
- for(i=0; i<5; i++){
- sprintf(numer_filozofa, "%d", i);
- switch (fork()){
- case -1:
- printf("blad utworzenia procesu potomnego!\n");
- exit(1);
- case 0:
- execl("./filozof", numer_filozofa, numer_filozofa, NULL);
- break;
- }
- }
- printf("program rozpoczyna swoje dzialanie! \n");
- while(1){
- if(najedzeni==5){
- printf("Wszyscy filozofowie sa najedzeni! Sukces!\n");
- msgctl(MSGid, IPC_RMID, NULL);
- shmdt(widelce);
- shmctl(SHMid, IPC_RMID, NULL);
- exit(0);
- }
- msgrcv(MSGid, (struct komunikat*) &kom, 2, 1, 0);
- if(kom.tresc[1]=='j') { // jem
- printf("filozof numer %d je.\n", kom.tresc[0]);
- } else if (kom.tresc[1]=='m') { // myślę
- printf("filozof numer %d mysli.\n", kom.tresc[0]);
- } else if (kom.tresc[1]=='n') { // najadłem się
- printf("filozof numer %d sie najadl i wyszedl.\n", kom.tresc[0]);
- najedzeni++;
- }
- fflush(stdout);
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment