Advertisement
Guest User

Untitled

a guest
Jan 25th, 2015
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.30 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include <time.h>
  5. #include <unistd.h>
  6. #include <sys/ipc.h>
  7. #include <sys/msg.h>
  8. #include <sys/shm.h>
  9.  
  10. #define WIDELEC0 1
  11. #define WIDELEC1 2
  12. #define WIDELEC2 3
  13. #define WIDELEC3 4
  14. #define WIDELEC4 5
  15.  
  16. #define LICZBAFILOZOFOW 5
  17. #define STANY 3
  18.  
  19. int stan[STANY] = { 0, 1, 2} // 0 - stan myslenie // 1 - stan glodu (chec jedzenia) // 2 - stan kiedy je (jedzenie)
  20.  
  21. key_t kluczKolejki;
  22. key_t kluczPamieci;
  23. int idKolejki;
  24. int idFilozofa;
  25. int idPamieci;
  26. int *widelce;
  27.  
  28. struct Wiadomosc
  29. {
  30. long typ;
  31. int wartosc;
  32. };
  33.  
  34. void pokazWidelce()
  35. {
  36. int i = 0;
  37. printf("Tablica widelcow: ");
  38. for(i = 0; i < LICZBAFILOZOFOW; i++)
  39. printf("\t%d",widelce[i]);
  40. printf("\n");
  41. }
  42.  
  43. void myslenie()
  44. {
  45. printf("Filozof nr %d sobie mysli ...\n",idFilozofa);
  46. sleep(1);
  47. }
  48.  
  49. void jedzenie()
  50. {
  51. printf("\n--------------------------------\n");
  52. printf("Filozof nr %d je ...\n",idFilozofa);
  53. sleep(1);
  54. pokazWidelce();
  55. printf("Filozof nr %d skonczyl jesc\n", idFilozofa);
  56. }
  57.  
  58.  
  59. void test(int k)
  60. {
  61. if ( stan[(k - 1) % 5] != 2 && stan[k] = 1 && stan[(k + 1) % 5] != 2 )
  62. {
  63. stan[k] = 2;
  64. msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0);
  65. }
  66. }
  67.  
  68.  
  69. int main(int argc, char *argv[])
  70. {
  71. srand(time(NULL));
  72. struct Wiadomosc wiadomosc;
  73. idFilozofa = atoi(argv[1]);
  74. int i = 0;
  75. int prawyWidelec, lewyWidelec;
  76.  
  77. if((kluczKolejki=ftok(".",'A')) == -1)
  78. {
  79. perror("Nie mozna utworzyc klucza kolejki");
  80. exit(EXIT_FAILURE);
  81. }
  82.  
  83. if((kluczPamieci=ftok(".",'B')) == -1){
  84. perror("Nie mozna utworzyc klucza pamieci");
  85. exit(EXIT_FAILURE);
  86. }
  87.  
  88. if((idKolejki=msgget(kluczKolejki,0666))==-1)
  89. {
  90. perror("Nie mozna utworzyc kolejki");
  91. exit(EXIT_FAILURE);
  92. }
  93.  
  94. if((idPamieci=shmget(kluczPamieci,LICZBAFILOZOFOW*sizeof(int),0666)) == -1)
  95. {
  96. perror("Nie mozna utworzyc pamieci dzielonej");
  97. exit(EXIT_FAILURE);
  98. }
  99.  
  100. if((widelce=(int*)shmat(idPamieci,0,0)) == -1)
  101. {
  102. perror("Nie mozna przypisac pamieci dzielonej");
  103. exit(EXIT_FAILURE);
  104. }
  105.  
  106. for(i = 0; i < 10; i++)
  107. {
  108. myslenie();
  109. name = idFilozofa;
  110. msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), name, 0);
  111. stan[name] = 1;
  112. test(name);
  113. wiadomosc.typ = ?
  114. msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0);
  115. msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), name, 0);
  116. widelec[name] = 1;
  117. widelec[(name + 1) % 5] = 1;
  118. jedzenie();
  119. widelec[name] = 0;
  120. widelec[(name + 1) % 5] = 0;
  121. msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), name, 0);
  122. stan[name] = 0;
  123. test((name + 1) % 5);
  124. test((name - 1) % 5);
  125. wiadomosc.typ = ?
  126. pokazWidelce();
  127. wiadomosc.typ = ?
  128. msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0);
  129. }
  130. }
  131. // myslenie();
  132. // lewyWidelec = idFilozofa;
  133. // prawyWidelec = idFilozofa+1;
  134. /* if(prawyWidelec == 6) prawyWidelec = 1;
  135. msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), JADALNIA, 0);
  136. msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), lewyWidelec, 0);
  137. msgrcv(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), prawyWidelec, 0);
  138.  
  139. widelce[lewyWidelec-1] = idFilozofa;
  140. widelce[prawyWidelec-1] = idFilozofa;
  141.  
  142. jedzenie();
  143.  
  144. widelce[lewyWidelec-1] = 0;
  145. widelce[prawyWidelec-1] = 0;
  146.  
  147. wiadomosc.typ = lewyWidelec;
  148. msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0);
  149. wiadomosc.typ = prawyWidelec;
  150. msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0);
  151. pokazWidelce();
  152. wiadomosc.typ = JADALNIA;
  153. msgsnd(idKolejki, &wiadomosc, sizeof(wiadomosc.wartosc), 0); */
  154. // procedure filozof;
  155. // begin
  156. // repeat
  157. // myślenie;
  158. // wait(jadalnia);
  159. // wait(sem[name]);
  160. // wait(sem[(name+1)mod 5]);
  161. // request (widelec[name], widelec[(name+1)mod5]);
  162. // jedzenie;
  163. // release(widelec[name], widelec[(name+1)mod5]);
  164. // signal(sem[name]);
  165. // signal(sem[(name+1)mod 5]);
  166. // signal(jadalnia);
  167. // end
  168. // end
  169. // }
  170.  
  171. //}
  172. /*
  173. procedure filozof;
  174. begin
  175. repeat
  176. myślenie;
  177. wait(w);
  178. stan[name]:=1;
  179. test(name);
  180. signal(w);
  181. wait(sem[name]);
  182. request (widelec[name],widelec[(name+1)mod5]);
  183. jedzenie;
  184. release(widelec[name],widelec[(name+1)mod5]);
  185. wait(w);
  186. stan[name]:=0;
  187. test((name+1)mod 5);
  188. test((name-1)mod 5);
  189. signal(w)
  190. end
  191. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement