Advertisement
Guest User

Untitled

a guest
Mar 30th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.98 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <semaphore.h>
  4. #include <stdlib.h>
  5. #include "lib.h"
  6. #include <sys/wait.h>
  7. /**
  8. *Problem je Citatel/Zapisovatel
  9. *Citatel=Monitor
  10. *Zapisovatel=Cidlo
  11. signa=0
  12. turniket=1
  13. ko =1
  14. mutex mon =1
  15. mutex_cidlo=1
  16.  
  17. * Monitor Cidlo
  18. signal.wait signal.post
  19. turniket.wait
  20. turniket.post
  21. * mutex_mon.wait mutex_cidlo.wait
  22. mon++ cidlo++
  23. if mon = 1
  24. turniket.wait if cidlo=1
  25. KO.lock KO.lock
  26. * mutex_mon.unlock mutex_cidlo.unlock
  27. * read.. data write data..
  28. * mutex_mon.wait mutex_cidlo.lock
  29. cidlo--
  30. mon-- if cidlo == 0
  31. if mon ==0
  32. turniket.unlock KO.unlock
  33. KO.unlock
  34. * mutex_mon.signal mutex_cidlo.unlock
  35.  
  36. */
  37. typedef struct data_struct {
  38. sem_t mutex_mon;
  39. sem_t mutex_cidlo;
  40. sem_t ko;
  41. sem_t turniket;
  42. sem_t signal;
  43. int cidlo;
  44. int monitor;
  45. } DATA;
  46. DATA * data;
  47. void lightswitch_lock_mon(){
  48. if(sem_wait(&data->mutex_mon)){
  49. fprintf(stderr,"nepodarilo sa zamknut sem");
  50. }
  51. data->monitor++;
  52. if (data->monitor == 1){
  53.  
  54. if(sem_wait(&data->turniket)){
  55. fprintf(stderr,"nepodarilo sa zamknut sem");
  56. }
  57.  
  58.  
  59. if(sem_wait(&data->ko)){
  60. fprintf(stderr,"nepodarilo sa zamknut sem");
  61. }
  62. }
  63.  
  64. if(sem_post(&data->mutex_mon)){
  65. fprintf(stderr,"nepodarilo sa odomknut sem");
  66. }
  67. }
  68. void lightswitch_unlock_mon(){
  69. if(sem_wait(&data->mutex_mon)){
  70. fprintf(stderr,"nepodarilo sa zamknut sem");
  71. }
  72. data->monitor--;
  73. if (data->monitor == 0){
  74. if(sem_post(&data->turniket)){
  75.  
  76. fprintf(stderr,"nepodarilo sa odomknut sem");
  77. }
  78. if(sem_post(&data->ko)){
  79. fprintf(stderr,"nepodarilo sa odomknut sem");
  80. }
  81. }
  82.  
  83. if(sem_post(&data->mutex_mon)){
  84. fprintf(stderr,"nepodarilo sa odomknut sem");
  85. }
  86. }
  87. void lightswitch_lock_cid(){
  88.  
  89. if(sem_wait(&data->mutex_cidlo)){
  90. fprintf(stderr,"nepodarilo sa zamknut sem");
  91. }
  92. data->cidlo++;
  93. if (data->cidlo == 1){
  94. if(sem_wait(&data->ko)){
  95. fprintf(stderr,"nepodarilo sa zamknut sem");
  96. }
  97. }
  98.  
  99. if(sem_post(&data->mutex_cidlo)){
  100. fprintf(stderr,"nepodarilo sa odomknut sem");
  101. }
  102. }
  103. void lightswitch_unlock_cid(){
  104.  
  105. if(sem_wait(&data->mutex_cidlo)){
  106. fprintf(stderr,"nepodarilo sa zamknut sem");
  107. }
  108. data->cidlo--;
  109. if (data->cidlo == 0){
  110. if(sem_post(&data->ko)){
  111. fprintf(stderr,"nepodarilo sa odomknut sem");
  112. }
  113. }
  114.  
  115. if(sem_post(&data->mutex_cidlo)){
  116. fprintf(stderr,"nepodarilo sa odomknut sem");
  117. }
  118. }
  119. void monitor(int monitor){
  120. while(1){
  121. usleep(500);
  122.  
  123. if(sem_wait(&data->signal)){
  124. fprintf(stderr,"nepodarilo sa zamknut sem");
  125. }
  126.  
  127. lightswitch_lock_mon();
  128. if(sem_wait(&data->mutex_mon)){
  129. fprintf(stderr,"nepodarilo sa zamknut sem");
  130. }
  131. printf("monit %02d: pocet_citajucich_monitorov=%02d\n",monitor,data->monitor);
  132. usleep(rand()%200);
  133. if(sem_post(&data->mutex_mon)){
  134. fprintf(stderr,"nepodarilo sa odomknut sem");
  135. }
  136. lightswitch_unlock_mon();
  137.  
  138. }
  139. }
  140. void cidlo(int cidlo){
  141. while(1){
  142.  
  143. if(sem_post(&data->signal)){
  144. fprintf(stderr,"nepodarilo sa odomknut sem");
  145. }
  146.  
  147. if(sem_wait(&data->turniket)){
  148. fprintf(stderr,"nepodarilo sa zamknut sem");
  149. }
  150. if(sem_post(&data->turniket)){
  151. fprintf(stderr,"nepodarilo sa odomknut sem");
  152. }
  153. lightswitch_lock_cid();
  154. if(sem_wait(&data->mutex_cidlo)){
  155. fprintf(stderr,"nepodarilo sa zamknut sem");
  156. }
  157. int rand_num=rand()%6+10;
  158. printf("cidlo %02d: pocet_zapisujucich_cidiel=%02d, trvanie_zapisu=%03d\n", cidlo,data->cidlo,rand_num);
  159. usleep(rand_num);
  160. if(sem_post(&data->mutex_cidlo)){
  161. fprintf(stderr,"nepodarilo sa odomknut sem");
  162. }
  163. lightswitch_unlock_cid();
  164. }
  165. }
  166.  
  167. int main(){
  168. data = (DATA*) malloc_shared(sizeof(DATA));
  169. if(data== NULL){
  170. fprintf(stderr,"Chyba vo vytvarani zdielanej pamate");
  171. }
  172. int pocet_cidiel=11;
  173. int i=0;
  174. pid_t pid;
  175. data->cidlo=0;
  176. data->monitor=0;
  177.  
  178. if(sem_init(&data->mutex_cidlo,1,1)){
  179. fprintf(stderr,"Chyba vo vytvarani semaforu");
  180. }
  181. if(sem_init(&data->mutex_mon,1,1)){
  182. fprintf(stderr,"Chyba vo vytvarani semaforu");
  183. }
  184. if(sem_init(&data->ko,1,1)){
  185. fprintf(stderr,"Chyba vo vytvarani semaforu");
  186. }
  187. if(sem_init(&data->signal,1,0)){
  188. fprintf(stderr,"Chyba vo vytvarani semaforu");
  189. }
  190. if(sem_init(&data->turniket,1,1)){
  191. fprintf(stderr,"Chyba vo vytvarani semaforu");
  192. }
  193. printf ("pocet cidiel : %d \n",pocet_cidiel);
  194. for(i=0;i<pocet_cidiel;i++){
  195. pid=fork();
  196. switch(pid){
  197. case 0:
  198. cidlo(i);
  199. exit(EXIT_SUCCESS);
  200. break;
  201. case -1:
  202. fprintf(stderr,"Chyba vo vytvarani procesu");
  203. exit(EXIT_FAILURE);
  204. default:
  205. continue;
  206. }
  207.  
  208. }
  209. printf("V PICI SOM TU\n");
  210. int pocet_monitorov=2;
  211. for(i=0;i<pocet_monitorov;i++){
  212. pid=fork();
  213. switch(pid){
  214. case 0:
  215. monitor(i);
  216. exit(EXIT_SUCCESS);
  217. break;
  218. case -1:
  219. fprintf(stderr,"Chyba vo vytvarani procesu");
  220. exit(EXIT_FAILURE);
  221. default:
  222. continue;
  223. }
  224. }
  225. for(i=0;i<pocet_monitorov+pocet_cidiel;i++){
  226. wait(NULL);
  227. }
  228. free_shared(data);
  229. return 0;
  230. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement