Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <sys/shm.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- int P(int semID, int number, int flags)
- {
- struct sembuf operacje;
- operacje.sem_num = number;
- operacje.sem_op = -1;
- operacje.sem_flg=0|flags;//SEM_UNDO;
- if (semop(semID, &operacje, 1)==-1)
- {
- perror("Blad semop (P)");
- return -1;
- }
- return 1;
- }
- void V(int semID, int number)
- {
- struct sembuf operacje;
- operacje.sem_num =number;
- operacje.sem_op =1;
- operacje.sem_flg=SEM_UNDO;
- if(semop(semID,&operacje,1)==-1)
- {
- perror("Blad semop (V)");
- }
- }
- int main(int argc, char *argv[])
- {
- key_t kluczs, kluczm;//klucz do semafora i pamieci dzielonej
- int M=5; //ile razy filozof wykonuje petle
- int semID; // identyfikator zestawu semaforow
- int N=6; //liczba semaforow - widelec +jadalnia
- int i;
- int numer; //numer filozofa
- int shmID; //identyfikator pamieci dzielonej
- char bufor[3];
- int *widelec; //tablica widelcow
- if((kluczs=ftok(".", 123))==-1)
- {
- printf("Blad ftok (main)\n");
- exit(-1);
- }
- //dostanie sie do zestawu semaforwo
- if((semID=semget(kluczs,N,0600|IPC_CREAT|IPC_EXCL))==-1)
- {
- printf("Blad semget\n");
- exit(-1);
- }
- kluczm=ftok(".",456);//tworzenie klucza
- //dostep pamieci dzielonej
- if((shmID=shmget(kluczm,5*sizeof(int),0600|IPC_CREAT))==-1)
- {
- printf("Blad shmget\n");
- exit(-1);
- }
- fflush(stdout);
- widelec=(int*)shmat(shmID,0,0); //przylaczanie pam.zielonej
- numer=atoi(argv[1]); //pobranie numeru filozofa
- for(i=0;i<M;i++)
- {
- printf("Filozof %d mysli\n",numer)+1;
- P(semID,5,SEM_UNDO); //podniesienie semaforu jadalnia
- printf("fill. %d wchodzi do jadalni %d raz\n",numer+1,i+1);
- P(semID,numer,SEM_UNDO); //czekanie na lewy widelec
- P(semID,(numer+1)%5,SEM_UNDO); //czekanie na prawy widelec
- //podniesienie widelcow; ustawienie numeru filozofa
- widelec[(numer+1%5)]=numer;
- widelec[numer]=numer;
- printf("\nFilozof %d je\n", numer+1);//jedzenie
- //zwolnienie widelcow
- widelec[(numer+1)%5]=-1;
- widelec[numer]=-1;
- V(semID,numer);
- V(semID,(numer+1)%5);
- V(semID,5); //zwolnienie jadalni
- printf("Filozof %d wychodzi z jadalni\n",numer+1);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement