Advertisement
djk77

prvi

Apr 6th, 2020
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.50 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <pthread.h>
  5. #include <stdlib.h>
  6. #include <signal.h>
  7. #include <sys/types.h>
  8. #include <sys/ipc.h>
  9. #include <sys/msg.h>
  10.  
  11. struct msgbuf{
  12. long mtype;
  13. char mtext[128];
  14. };
  15.  
  16. int brojPosjetitelja = 8;
  17. int size = 4;
  18. int brojac = 0;
  19. int ukupnoPosjetitelja = 0;
  20. int vrtuljakQueue=0;
  21. int naVrtuljku=0;
  22. int spavaj;
  23. key_t key;
  24. int vrtuljakqid = -1;
  25. int qids[8] = {0};
  26. int msgflg = IPC_CREAT | 0666;
  27.  
  28. /*enum poruka{
  29. zelim=0,
  30. ustani=1,
  31. ustani=2
  32. };
  33. */
  34. void die(char *s)
  35. {
  36. printf("Greška");
  37. perror(s);
  38. exit(1);
  39. }
  40.  
  41. void *posjetitelj(void *vargp) {
  42. brojac++;
  43. struct msgbuf posjetiteljwrite;
  44. key_t pkey = key+brojac;
  45. int posjetiteljqid = msgget(pkey, msgflg);
  46. if(posjetiteljqid<0){
  47. die("posjetiteljqid");
  48. }
  49. int ponavljaj=0;
  50.  
  51. while(ponavljaj<3){
  52. spavaj = rand() % (2 + 1 - 1) + 1;
  53. sleep(spavaj);
  54. if(vrtuljakQueue<8){ //zahtjev za voznju
  55. qids[vrtuljakQueue]=posjetiteljqid;
  56. vrtuljakQueue++;
  57. posjetiteljwrite.mtype = 1;
  58. strcpy(posjetiteljwrite.mtext, "Zelim se voziti");
  59. size_t len = strlen(posjetiteljwrite.mtext)+1;
  60.  
  61. int rc=msgsnd(vrtuljakqid, &posjetiteljwrite, len, 0){
  62. if(rc==-1){
  63. die("msgsnd");
  64. }
  65.  
  66. int rc=-1;
  67. while(rc==-1) {
  68. if(msgrcv(posjetiteljqid, &posjetiteljwrite, 128, 1, 0)!=-1){
  69. int sjeo = strcmp(posjetiteljwrite.mtext, "Sjedi");
  70. if(sjeo==0){
  71. printf("Sjeo POSJETITELJ %d \n", posjetiteljqid);
  72. naVrtuljku++;
  73. rc=-1;
  74. }
  75. int ustao = strcmp(pwrite.mtext, "Ustani");
  76. if(ustao==0){
  77. naVrtuljku--;
  78. vrtuljakQueue--;
  79. printf("Sisao POSJETITELJ %d \n", posjetiteljqid);
  80. break;
  81. }
  82. }
  83. else{
  84. die("msgrcv");
  85. }
  86. }
  87. ponavljaj++;
  88. }
  89. }
  90. brojac--;
  91. msgctl(posjetiteljqid, IPC_RMID, NULL);
  92. printf("POSJETITELJ %d zavrsio s voznjom\n", posjetiteljqid);
  93. return NULL;
  94. }
  95.  
  96. void *vrtuljak(void *vargp) {
  97. struct msgbuf vrtuljaread;
  98. key_t vkey = key;
  99. vrtuljakqid = msgget(vkey, msgflg);
  100. if(vrtuljakqid<0){
  101. die("vrtuljakqid");
  102. }
  103.  
  104. while(1) {
  105. while(ukupnoPosjetitelja < size){
  106. if(msgrcv(vrtuljakqid, &vrtuljakread, 128, 1, 0)<0){
  107. die(msgrcv);
  108. }else{
  109. int rckey=qids[ukupnoPosjetitelja];
  110. ukupnoPosjetitelja++;
  111.  
  112. if(ukupnoPosjetitelja <= size){
  113. vrtuljakread.mtype = 1;
  114. strcpy(vrtuljakread.mtext, "Sjedi");
  115. size_t len = strlen(vrtuljakread.mtext)+1;
  116. msgsnd(rckey, &vrtuljakread, len, 0);
  117. }
  118.  
  119. }
  120.  
  121. if(ukupnoPosjetitelja == size & naVrtuljku==size){
  122. printf("Vrtuljak pokrenut.\n");
  123. int spavaj = rand() % (3 + 1 - 1) + 1;
  124. sleep(spavaj);
  125. printf("Vrtuljak zaustavljen.\n");
  126. for(int j=0; j<size; j++){
  127. vrtuljakread.mtype = 1;
  128. strcpy(vrtuljakread.mtext, "Ustani");
  129. size_t len = strlen(vrtuljakread.mtext)+1;
  130. int rc=msgsnd(qids[j], &vrtuljakread, len, 0)
  131. if(rc==-1){
  132. die("msgsnd");
  133. }else
  134. qids[j]=qids[j+size]; //pomicanje reda
  135. }
  136. }
  137. while(naVrtuljku!=0){}
  138. ukupnoPosjetitelja = 0;
  139. if(brojac<size){
  140. msgctl(vrtuljakqid, IPC_RMID, NULL);
  141. printf("Vrtuljak zavrsio \n");
  142. break;
  143. }
  144. }
  145. }
  146.  
  147. return NULL;
  148. }
  149.  
  150.  
  151. int main(){
  152. srand((unsigned)time(NULL));
  153. pthread_t threads[brojPosjetitelja+1];
  154. key=getuid();
  155. int i=0;
  156. //pokrenuti vrtuljak;
  157. pthread_create(&threads[i], NULL, vrtuljak, NULL);
  158. while(vrtuljakqid==-1){}
  159. for (i = 1; i <=brojPosjetitelja; i++) {
  160. //pokrenuti posjetitelje;
  161. pthread_create(&threads[i], NULL, posjetitelj, NULL);
  162. }
  163. for (i = 1; i <=brojPosjetitelja; i++) {
  164. pthread_join(threads[i], NULL);
  165. }
  166.  
  167. return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement