Advertisement
djk77

novo

Apr 1st, 2020
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.18 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include<stdlib.h>
  4. #include <sys/stat.h>
  5. #include <sys/types.h>
  6. #include <fcntl.h>
  7. #include <unistd.h>
  8. #include <sys/wait.h>
  9. #include <time.h>
  10.  
  11. #define MAX(a,b) ((a) > (b) ? (a) :(b))
  12. #define RESPONSE "Odgovor"
  13. #define REQUEST "Zahtjev"
  14. #define MAXREAD 20 /* najveca duljina poruke*/
  15. #define BUFFERSIZE 30
  16. #define N 5
  17.  
  18. int processID;
  19. int sat=1;
  20. int cjevovod[N][N][2];
  21. int responseQ[N];
  22. char recBuf[BUFFERSIZE];
  23. char sendBuf[BUFFERSIZE];
  24.  
  25. enum operacija {
  26. citaj=0,
  27. pisi=1
  28. };
  29.  
  30. //stvara se cjevovod ide od 1 da ne bi imala filozofa nula ugl
  31. void stvoriCjevovod(){
  32. for(int x=1; x<N+1; x++){
  33. for(int y=1; y<N+1; y++){
  34. if(x==y) continue;
  35. pipe(cjevovod[x][y]); // ovo je ka npr cjevovod koji spaja procese 1-2(1 je ulaz a 2 izlaz), isto se stvara i 2-1(2 ulaz, a 1 izlaz)
  36. }}}
  37.  
  38. void posaljiPoruku(int i, int clock, const char* message){
  39. sprintf(sendBuf, "%s(%d, %d)", message, processID, clock);
  40. printf("Filozof F%d salje poruku %s filozofu F%d\n", processID, sendBuf, i);
  41. write(cjevovod[processID][i][pisi], sendBuf, strlen(sendBuf)+1);
  42. }
  43.  
  44. void primiPoruku(int i, int* drugiID, int* otherClock){
  45. read(cjevovod[i][processID][citaj],recBuf, MAXREAD);
  46. sscanf(recBuf, "%*7s(%d,%d)", drugiID, otherClock);
  47. printf("Filozof P%d prima poruku %s\n", processID, recBuf);
  48. sat=MAX(sat, *otherClock)+1;
  49.  
  50. }
  51.  
  52. void posaljiZAHTJEV(){
  53. for(int i=1; i<N+1; ++i){
  54. if(i==processID){ continue;}
  55. posaljiPoruku(i, sat, REQUEST);
  56. }
  57. }
  58.  
  59. void primiODGOVOR(){
  60. int drugiID, otherClock;
  61. for(int i=1; i<N+1; i++){
  62. if(i==processID) continue;
  63. primiPoruku(i, &drugiID, &otherClock);
  64. }
  65. }
  66.  
  67. void posaljiODGOVOR(){
  68. for(int i=1; i<N+1;i++){
  69. if(i==processID) continue;
  70. if(responseQ[i]){
  71. posaljiPoruku(i, responseQ[i], RESPONSE);
  72. responseQ[i]=0;
  73. }
  74. }
  75. }
  76.  
  77. void primiZAHTJEV(){
  78. int drugiPID, otherClock;
  79. int trenutniSat=sat;
  80. for(int i=1; i<N+1;i++){
  81. if(i==processID) continue;
  82. primiPoruku(i, &drugiPID, &otherClock);
  83. if((trenutniSat<otherClock) || (trenutniSat==otherClock && otherClock && processID <i)){
  84. responseQ[i]=otherClock; //ovo gledam koji je sat vec
  85. }else{ posaljiPoruku(i, otherClock, RESPONSE);
  86. }
  87. }
  88. }
  89.  
  90. void KO(){
  91. printf("Filozof %d je za stolom\n", processID);
  92. sat++;
  93. sleep(3);
  94. }
  95.  
  96. void konferencija(){
  97. int randNum=(rand()%((2000+1)-100)+100)*1000;
  98. usleep(randNum);
  99. printf("Filozof %d sjedi na konferenciji%d ms\n", processID,randNum);
  100. }
  101.  
  102. void filozof(){
  103. konferencija();
  104. posaljiZAHTJEV(); //zeli za stol, salje svima
  105. primiZAHTJEV();
  106. primiODGOVOR();
  107. KO();
  108. posaljiODGOVOR();
  109. }
  110.  
  111. void zatvori(){
  112. for(int i=1; i<N+1;++i){
  113. if(i==processID){ continue;}
  114. close(cjevovod[processID][i][citaj]); //zatvaram kraj za citanje
  115. close(cjevovod[i][processID][pisi]); //zatvaram kraj za pisanje
  116. }
  117. for(int i=0;i<N;++i){
  118. filozof();
  119.  
  120. }
  121.  
  122. }
  123.  
  124.  
  125. int main(void)
  126. { int sjedi[5];
  127. srand((unsigned)time(NULL));
  128. stvoriCjevovod();
  129. for(int i=1; i<N+1; i++){
  130. int pId=fork();
  131.  
  132. if(pId== -1){
  133. printf("Dijete nije kreirano");
  134. exit(1);
  135. }else if(pId==0){
  136. processID=i;
  137. zatvori();
  138. exit(0);
  139. }
  140. }
  141. for(int i=0; i<N;){
  142. if(wait(NULL)>0)
  143. i++;
  144. }
  145.  
  146.  
  147.  
  148. return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement