Advertisement
Guest User

Untitled

a guest
Dec 13th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.58 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_full_id, sem_free_id, sem_data;
  16. int sem_readers_id, sem_readA_id, sem_readB_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.  
  31. if( (sem_readA_id = sem_allocate(sem_readA_key , 0666 | IPC_CREAT)) < 0) exit(1);
  32. if( (mutex_readers = mutex_allocate(mutex_readers_key, 0666 | IPC_CREAT)) < 0) exit(1);
  33.  
  34. if( (sem_readB_id = sem_allocate(sem_readB_key , 0666 | IPC_CREAT)) < 0) exit(1);
  35.  
  36. if( (sem_readers_id = sem_allocate(sem_readers_key , 0666 | IPC_CREAT)) < 0) exit(1);
  37.  
  38. if( (buff_id = mutex_allocate(sem_buff_key, 0666 | IPC_CREAT)) < 0) exit(1);
  39.  
  40. if( (sem_data = sem_allocate(sem_data_key, 0666 | IPC_CREAT)) < 0) exit(1);
  41.  
  42. if( (sem_free_id = sem_allocate(free_key, 0666 | IPC_CREAT)) < 0) exit(1);
  43.  
  44. if( (sem_full_id = sem_allocate(full_key, 0666 | IPC_CREAT)) < 0) exit(1);
  45.  
  46. mutex_init(buff_id);
  47. mutex_init(mutex_readers);
  48. sem_init(sem_readA_id, 1);
  49. sem_init(sem_readB_id, 1);
  50. sem_init(sem_readers_id, 0);
  51. sem_init(sem_data, 1);
  52. sem_init(sem_free_id, MAX_BUFF);
  53. sem_init(sem_full_id, 0);
  54.  
  55.  
  56. for(;;){
  57. if(sem_getVal(sem_data)<=0){
  58. break;
  59. }
  60. //jest wiadomosc ?
  61. //czekaj az z queue mozna bedzie czytac
  62. mutex_wait(sem_full_id);
  63. printf("readerA dead");
  64. mutex_wait(sem_readA_id);
  65. mutex_wait(buff_id);
  66. letter = bufferGet(buff); //pobierz wiadomosc ale nie zdejmu
  67. printf("read: %d \n", letter);
  68. sem_change(sem_readA_id, -1);
  69. sem_change(sem_readers_id, 1);
  70. mutex_post(buff_id);
  71.  
  72. //wyjdz z sekcji krytycznej
  73. randSleep2();
  74.  
  75.  
  76. }
  77. // powiedz innym aby break;
  78. union semun arg;
  79. arg.val = 0;
  80. semctl(sem_data, 0, SETVAL, arg);
  81.  
  82. // wyłączamy segment pamięci wspólnej
  83. shmdt(buff);
  84.  
  85. mutex_deallocate(buff_id);
  86. mutex_deallocate(sem_readA_id);
  87. mutex_deallocate(sem_readers_id);
  88. mutex_deallocate(mutex_readers);
  89. sem_deallocate(sem_free_id);
  90. sem_deallocate(sem_full_id);
  91. sem_deallocate(sem_data);
  92.  
  93.  
  94. return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement