Guest User

Untitled

a guest
Oct 16th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.65 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/ipc.h>
  6. #include <sys/shm.h>
  7. #include <sys/sem.h>
  8. #include <sys/wait.h>
  9.  
  10. #define MAXCOUNT ((FUSS_B+FUSS_A)*17)
  11. #define FUSS_B 15.51337
  12. #define FUSS_A 13.13123
  13. #define SHM_ERROR "Shared Memory konnte nicht erstellt werden!"
  14. #define FORK_ERROR "fork() konnte keinen Kindprozess erzeugen!"
  15.  
  16. int main(int argc, char * argv[])
  17. {
  18. /* Hilfsvariablen*/
  19. int i, sleep_time;
  20. if(argc <= 1)
  21. {
  22. fprintf(stderr,"Zeit in us angeben !\n");
  23. return EXIT_FAILURE;
  24. }
  25. sleep_time = strtol(argv[1],NULL,10);
  26. /* Semaphore initialisieren*/
  27. int sem_id;
  28. unsigned short marker[1];
  29. sem_id = semget (IPC_PRIVATE, 1, IPC_CREAT|0644); /*anlegen*/
  30. if(sem_id == -1)
  31. {
  32. fprintf(stderr,"Fehler bei Semaphore !\n");
  33. return EXIT_FAILURE;
  34. }
  35. marker[0] = 1;
  36. semctl(sem_id, 1, SETALL, marker);
  37. /* PIDs der Kindprozesse*/
  38. int pid[2];
  39. /* Shared Memorys generieren und bei Fehlern aussteigen*/
  40. double *area,id;
  41. int *sperr_fuer_kind,id_sperr;
  42. id = shmget( IPC_PRIVATE, 2*sizeof(double),0600);
  43. if(id == -1)
  44. {
  45. fprintf(stderr,SHM_ERROR);
  46. return EXIT_FAILURE;
  47. }
  48. id_sperr = shmget( IPC_PRIVATE , sizeof(int),0600);
  49. if(id_sperr == -1)
  50. {
  51. fprintf(stderr,SHM_ERROR);
  52. return EXIT_FAILURE;
  53. }
  54. area = (double*)shmat(id,0,0);
  55. if(area == NULL)
  56. {
  57. fprintf(stderr,SHM_ERROR);
  58. return EXIT_FAILURE;
  59. }
  60. sperr_fuer_kind = (int*)shmat(id_sperr,0,0);
  61. if(sperr_fuer_kind == NULL)
  62. {
  63. fprintf(stderr,SHM_ERROR);
  64. return EXIT_FAILURE;
  65. }
  66. /* Semaphore Strukturen zum sperren und freigeben*/
  67. struct sembuf enter, leave;
  68. enter.sem_num = 0; /* Semaphor 0 in der Gruppe*/
  69. enter.sem_op = -1; /* blockieren*/
  70. enter.sem_flg = SEM_UNDO;
  71. leave.sem_num = 0; /* Semaphor 0 in der Gruppe*/
  72. leave.sem_op = 1; /* freigeben*/
  73. leave.sem_flg = SEM_UNDO;
  74. /* Bereich zuruecksetzen*/
  75. *area = MAXCOUNT;
  76. *sperr_fuer_kind = 0;
  77. /* 1 Kindprozesse erzeugen*/
  78. pid[0] = fork();
  79. if(pid[0] == -1)
  80. {
  81. fprintf(stderr,FORK_ERROR);
  82. return EXIT_FAILURE;
  83. }
  84. if(pid[0] == 0) /* KIND 1*/
  85. {
  86. while(1)
  87. {
  88. semop(sem_id,&enter,1); /* Eintritt in kritischen Bereich*/
  89. if(*sperr_fuer_kind == 1 && *area > 0){
  90. semop(sem_id,&leave,1); /* Verlassen des krit. Bereichs*/
  91. continue;
  92. }
  93. if(*area > 0)
  94. {
  95. *area -= FUSS_A;
  96. }else{break;}
  97. *sperr_fuer_kind = 1;
  98. semop(sem_id,&leave,1); /* Verlassen des krit. Bereichs*/
  99. printf("POTT - %lf\n",*area);
  100. fflush(stdout);
  101. usleep(sleep_time);
  102.  
  103. }
  104. return EXIT_SUCCESS;
  105. }
  106. else
  107. {
  108. /* 2 Kindprozesse erzeugen*/
  109. pid[1] = fork();
  110. if(pid[1] == -1)
  111. {
  112. fprintf(stderr,FORK_ERROR);
  113. return EXIT_FAILURE;
  114. }
  115. if(pid[1] == 0) /* KIND 2*/
  116. {
  117. while(1)
  118. {
  119. semop(sem_id,&enter,1); /* Eintritt in kritischen Bereich*/
  120. if(*sperr_fuer_kind == 2 && *area > 0){
  121. semop(sem_id,&leave,1); /* Verlassen des krit. Bereichs*/
  122. continue;
  123. }
  124. if(*area > 0)
  125. {
  126. *area -= FUSS_B;
  127. }else{break;}
  128. *sperr_fuer_kind = 2;
  129. semop(sem_id,&leave,1); /* Verlassen des krit. Bereichs*/
  130. printf("PISS - %lf\n",*area);
  131. fflush(stdout);
  132. usleep(sleep_time);
  133. }
  134. return EXIT_SUCCESS;
  135. }
  136. /* VATER wartet auf alle Kinder*/
  137. for(i=0;i<2;i++)
  138. {
  139. waitpid(*(pid+i),NULL,0);
  140. }
  141. }
  142. /* Semaphore freigeben*/
  143. semctl(sem_id, 0, IPC_RMID);
  144. /* ENDE*/
  145. /* return EXIT_SUCCESS;*/
  146. if(*area < 0.1 && *area > -0.1)
  147. {
  148. /* Shared Memory loesen*/
  149. shmdt(area);
  150. shmdt(sperr_fuer_kind);
  151. shmctl(id, IPC_RMID, 0);
  152. shmctl(id_sperr, IPC_RMID, 0);
  153. printf("OK\n");
  154. return EXIT_SUCCESS;
  155. }
  156. else
  157. {
  158. /* Shared Memory loesen*/
  159. shmdt(area);
  160. shmdt(sperr_fuer_kind);
  161. shmctl(id, IPC_RMID, 0);
  162. shmctl(id_sperr, IPC_RMID, 0);
  163. printf("Nicht OK\n");
  164. return EXIT_FAILURE;
  165. }
  166. }
Add Comment
Please, Sign In to add comment