Advertisement
Guest User

Untitled

a guest
Dec 13th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 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, readers_id, readA_id;
  17. int seg_size;
  18. char *buff;
  19. int loop;
  20. char letter;
  21. char alphabet[ALPHABET_SIZE]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u'};
  22.  
  23. seg_size=(1+MAX_BUFF)*sizeof(char);
  24.  
  25. buff_id=shmget(buff_key, seg_size, 0666| IPC_CREAT);
  26.  
  27. if(buff_id<0){
  28. printf("shmget error");
  29. exit(1);
  30. }
  31. buff=(char*)shmat(buff_id, 0, 0);
  32. if( (buff_id = mutex_allocate(sem_buff_key, 0666 | IPC_CREAT)) < 0) exit(1);
  33.  
  34. if( (sem_data = sem_allocate(sem_data_key, 0666 | IPC_CREAT)) < 0) exit(1);
  35.  
  36. if( (sem_free_id = sem_allocate(free_key, 0666 | IPC_CREAT)) < 0) exit(1);
  37.  
  38. if( (sem_full_id = sem_allocate(full_key, 0666 | IPC_CREAT)) < 0) exit(1);
  39.  
  40. mutex_init(buff_id);
  41. sem_init(sem_data, 1);
  42. sem_init(sem_free_id, MAX_BUFF);
  43. sem_init(sem_full_id, 0);
  44.  
  45. buff[0] = 0; // w kolejce 0 procesow
  46.  
  47. for(loop=0; loop<REP; ++loop){
  48.  
  49. if(sem_getVal(sem_data)<=0){
  50. break;
  51. }
  52. letter = alphabet[rand() % ALPHABET_SIZE];
  53. if(sem_getVal(sem_free_id)>0){
  54. mutex_wait(buff_id);
  55.  
  56. bufferInsert(buff, letter);
  57. printf("have written: %d to buffer\n", letter);
  58. sem_change(sem_free_id, -1);
  59. sem_change(sem_full_id, 1);
  60. mutex_post(buff_id);
  61. printf("producent zwalnia\n");
  62. }
  63. randSleep1();
  64. }
  65.  
  66. union semun arg;
  67. arg.val = 0;
  68. semctl(sem_data, 0, SETVAL, arg);
  69.  
  70. // wyłączamy segment pamięci wspólnej
  71. shmdt(buff);
  72.  
  73. mutex_deallocate(buff_id);
  74. sem_deallocate(sem_free_id);
  75. sem_deallocate(sem_full_id);
  76.  
  77.  
  78. return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement