Advertisement
Guest User

Untitled

a guest
Dec 13th, 2017
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.39 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/shm.h>
  4. #include <sys/stat.h>
  5. #include <sys/ipc.h>
  6. #include <sys/sem.h>
  7. #include <sys/time.h>
  8. #include <sys/resource.h>
  9. #include <time.h>
  10. #include <math.h>
  11. #include "sem.h"
  12. #include "keys.h"
  13.  
  14. int main(int argc, char* argv[]){
  15. int buff_id, sem_buff_id, sem_full_id, sem_free_id, sem_data;
  16. int sem_readers_id, sem_readB_id, sem_readA_id, mutex_readers;
  17. int seg_size;
  18. char *buff;
  19. int loop;
  20. char letter;
  21. seg_size=(1+MAX_BUFF)*sizeof(char);
  22.  
  23. buff_id=shmget(buff_key, seg_size, 0666| IPC_CREAT);
  24.  
  25. if(buff_id<0){
  26. printf("shmget error");
  27. exit(1);
  28. }
  29. buff=(char*)shmat(buff_id, 0, 0);
  30. if( (buff_id = mutex_allocate(sem_buff_key, 0666 | IPC_CREAT)) < 0) exit(1);
  31. if( (mutex_readers = mutex_allocate(mutex_readers_key, 0666 | IPC_CREAT)) < 0) exit(1);
  32.  
  33. if( (sem_data = sem_allocate(sem_data_key, 0666 | IPC_CREAT)) < 0) exit(1);
  34.  
  35. if( (sem_free_id = sem_allocate(free_key, 0666 | IPC_CREAT)) < 0) exit(1);
  36.  
  37. if( (sem_full_id = sem_allocate(full_key, 0666 | IPC_CREAT)) < 0) exit(1);
  38. if( (sem_readA_id = sem_allocate(sem_readA_key , 0666 | IPC_CREAT)) < 0) exit(1);
  39.  
  40. if( (sem_readB_id = sem_allocate(sem_readB_key , 0666 | IPC_CREAT)) < 0) exit(1);
  41. if( (sem_readers_id = sem_allocate(sem_readers_key , 0666 | IPC_CREAT)) < 0) exit(1);
  42.  
  43. mutex_init(buff_id);
  44. mutex_init(mutex_readers);
  45. sem_init(sem_data, 1);
  46. sem_init(sem_free_id, MAX_BUFF);
  47. sem_init(sem_full_id, 0);
  48. sem_init(sem_readA_id, 1);
  49. sem_init(sem_readB_id, 1);
  50. sem_init(sem_readers_id, 0);
  51.  
  52.  
  53. for(;;){
  54. if(sem_getVal(sem_data)<=0){
  55. break;
  56. }
  57. if(sem_getVal(sem_readers_id)>0){
  58. mutex_wait(sem_full_id);
  59. mutex_wait(mutex_readers);
  60.  
  61.  
  62. if(sem_getVal(sem_readers_id)==1){
  63. printf("sem readers: %d\n", sem_getVal(sem_readers_id));
  64. mutex_wait(buff_id);
  65. letter = bufferPop(buff); //pobierz wiadomosc ale nie zdejmuj
  66. mutex_post(buff_id);
  67. mutex_post(sem_full_id);
  68. printf("\nconsumed: %d \n", letter);
  69. sem_change(sem_free_id, 1);
  70. sem_change(sem_readers_id, 1);
  71. if(sem_getVal(sem_readA_id)>0){
  72. sem_change(sem_readA_id, 1);
  73. }
  74. else{
  75. sem_change(sem_readB_id,1);
  76. }
  77. }
  78. else{
  79. mutex_wait(buff_id);
  80. printf("sem readers: %d\n", sem_getVal(sem_readers_id));
  81. letter = bufferPop(buff); //pobierz wiadomosc ale nie zdejmuj
  82. printf("\nconsumed: %d \n", letter);
  83. letter = bufferPop(buff); //pobierz wiadomosc ale nie zdejmuj
  84. printf("\nconsumed: %d \n", letter);
  85. mutex_post(buff_id);
  86. sem_change(sem_free_id, 1);
  87. sem_change(sem_free_id, 1);
  88. sem_change(sem_readers_id, -1);
  89. sem_change(sem_readers_id, -1);
  90.  
  91.  
  92. sem_change(sem_readA_id, 1);
  93. sem_change(sem_readB_id,1);
  94. mutex_post(mutex_readers);
  95. }
  96. //wyjdz z sekcji krytycznej
  97.  
  98. printf("konxcument wychodzi\n");
  99. randSleep2();
  100. }
  101.  
  102. }
  103. // powiedz innym aby break;
  104. union semun arg;
  105. arg.val = 0;
  106. semctl(sem_data, 0, SETVAL, arg);
  107.  
  108. // wyłączamy segment pamięci wspólnej
  109. shmdt(buff);
  110. mutex_deallocate(sem_readA_id);
  111. mutex_deallocate(sem_readB_id);
  112. mutex_deallocate(sem_readers_id);
  113. mutex_deallocate(buff_id);
  114. mutex_deallocate(mutex_readers);
  115. sem_deallocate(sem_free_id);
  116. sem_deallocate(sem_full_id);
  117.  
  118.  
  119. return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement