Advertisement
Guest User

filozof.c

a guest
Feb 9th, 2014
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/shm.h>
  4. #include <sys/ipc.h>
  5. #include <sys/sem.h>
  6.  
  7. int P(int semID, int number, int flags)
  8. {
  9. struct sembuf operacje;
  10. operacje.sem_num = number;
  11. operacje.sem_op = -1;
  12. operacje.sem_flg=0|flags;//SEM_UNDO;
  13. if (semop(semID, &operacje, 1)==-1)
  14. {
  15. perror("Blad semop (P)");
  16. return -1;
  17. }
  18. return 1;
  19. }
  20.  
  21. void V(int semID, int number)
  22. {
  23. struct sembuf operacje;
  24. operacje.sem_num =number;
  25. operacje.sem_op =1;
  26. operacje.sem_flg=SEM_UNDO;
  27. if(semop(semID,&operacje,1)==-1)
  28. {
  29. perror("Blad semop (V)");
  30. }
  31. }
  32.  
  33. int main(int argc, char *argv[])
  34. {
  35. key_t kluczs, kluczm;//klucz do semafora i pamieci dzielonej
  36. int M=5; //ile razy filozof wykonuje petle
  37. int semID; // identyfikator zestawu semaforow
  38. int N=6; //liczba semaforow - widelec +jadalnia
  39. int i;
  40. int numer; //numer filozofa
  41. int shmID; //identyfikator pamieci dzielonej
  42. char bufor[3];
  43. int *widelec; //tablica widelcow
  44.  
  45. if((kluczs=ftok(".", 123))==-1)
  46. {
  47. printf("Blad ftok (main)\n");
  48. exit(-1);
  49. }
  50. //dostanie sie do zestawu semaforwo
  51. if((semID=semget(kluczs,N,0600|IPC_CREAT|IPC_EXCL))==-1)
  52. {
  53. printf("Blad semget\n");
  54. exit(-1);
  55. }
  56. kluczm=ftok(".",456);//tworzenie klucza
  57. //dostep pamieci dzielonej
  58. if((shmID=shmget(kluczm,5*sizeof(int),0600|IPC_CREAT))==-1)
  59. {
  60. printf("Blad shmget\n");
  61. exit(-1);
  62. }
  63. fflush(stdout);
  64. widelec=(int*)shmat(shmID,0,0); //przylaczanie pam.zielonej
  65. numer=atoi(argv[1]); //pobranie numeru filozofa
  66. for(i=0;i<M;i++)
  67. {
  68. printf("Filozof %d mysli\n",numer)+1;
  69. P(semID,5,SEM_UNDO); //podniesienie semaforu jadalnia
  70. printf("fill. %d wchodzi do jadalni %d raz\n",numer+1,i+1);
  71. P(semID,numer,SEM_UNDO); //czekanie na lewy widelec
  72. P(semID,(numer+1)%5,SEM_UNDO); //czekanie na prawy widelec
  73. //podniesienie widelcow; ustawienie numeru filozofa
  74. widelec[(numer+1%5)]=numer;
  75. widelec[numer]=numer;
  76. printf("\nFilozof %d je\n", numer+1);//jedzenie
  77. //zwolnienie widelcow
  78. widelec[(numer+1)%5]=-1;
  79. widelec[numer]=-1;
  80. V(semID,numer);
  81. V(semID,(numer+1)%5);
  82. V(semID,5); //zwolnienie jadalni
  83. printf("Filozof %d wychodzi z jadalni\n",numer+1);
  84. }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement