Advertisement
Guest User

Untitled

a guest
Jan 26th, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <unistd.h>
  5. #include <sys/ipc.h>
  6. #include <sys/sem.h>
  7. #include <sys/shm.h>
  8. #include <errno.h>
  9.  
  10. int semafor;
  11. key_t klucz;
  12.  
  13. char *adres_pamieci;
  14. int pamiec;
  15. key_t klucz_pamieci;
  16.  
  17. int odlaczenie1, odlaczenie2;
  18.  
  19.  
  20.  
  21. static void utworz_klucz_semafora(void)
  22. {
  23. klucz = ftok(".",'v');
  24.  
  25. if(klucz == -1)
  26. {
  27. printf("Blad tworzenia klucza (producent)\n");
  28. exit(-1);
  29. }
  30. else
  31. printf("Zoastal utworzony klucz: %d (producent)\n", klucz);
  32. }
  33.  
  34. static void utworz_nowy_semafor(void)
  35. {
  36. semafor=semget(klucz, 2, 0666|IPC_CREAT);
  37. if (semafor==-1)
  38. {
  39. printf("Nie moglem utworzyc nowego semafora /producent.\n");
  40. exit(EXIT_FAILURE);
  41. }
  42. else
  43. {
  44. printf("Semafor zostal utworzony : %d /producent\n",semafor);
  45. }
  46. }
  47.  
  48. static void ustaw_semafor(int sem, int na)
  49. {
  50. int ustaw_sem;
  51. ustaw_sem = semctl(semafor, sem, SETVAL, na);
  52. if(ustaw_sem==-1)
  53. {
  54. printf("Nie mozna ustawic semafora.\n");
  55. exit(EXIT_FAILURE);
  56. }
  57. else
  58. {
  59. printf("Semafor zostal ustawiony.\n");
  60. }
  61.  
  62. }
  63.  
  64.  
  65. static void semafor_v(int nr)
  66. { int zmien_sem;
  67. struct sembuf bufor_sem;
  68. bufor_sem.sem_num=nr;
  69. bufor_sem.sem_op=1;
  70. bufor_sem.sem_flg=0;
  71.  
  72. while(1)
  73. {
  74. zmien_sem=semop(semafor, &bufor_sem,1);
  75. if(zmien_sem == 0 || errno != 4)
  76. break;
  77. }
  78.  
  79. if (zmien_sem==-1)
  80. {
  81.  
  82. printf("Nie moglem otworzyc semafora.\n");
  83. exit(EXIT_FAILURE);
  84. }
  85. else
  86. {
  87. printf("Semafor zostal otwarty.\n");
  88. }
  89. }
  90.  
  91. static void semafor_p(int nr)
  92. {
  93. int zmien_sem;
  94. struct sembuf bufor_sem;
  95. bufor_sem.sem_num = nr;
  96. bufor_sem.sem_op = -1;
  97. bufor_sem.sem_flg = 0;
  98.  
  99. while(1)
  100. { //100
  101. zmien_sem = semop(semafor, &bufor_sem, 1);
  102. if(zmien_sem == 0 || errno != 4)
  103. break;
  104. }
  105. if(zmien_sem == -1)
  106. {
  107. printf("Nie moglem zamknac semafora.\n");
  108. exit(EXIT_FAILURE);
  109. }
  110. else
  111. {
  112. printf("Semafor zostal zamkniety.\n");
  113. }
  114.  
  115. }
  116.  
  117. static void usun_semafor(void)
  118. {
  119. int sem;
  120. sem = semctl(semafor, 0, IPC_RMID);
  121. if(sem == -1)
  122. {
  123. printf("Nie mozna usunac semafora.\n");
  124. exit(EXIT_FAILURE);
  125. }
  126. else
  127. {
  128. printf("Semafor zostal usuniety: %d\n");
  129. }
  130. }
  131. static void utworz_klucz_pamieci_dzielonej(void)
  132. {
  133. klucz_pamieci = ftok(".",'V');
  134.  
  135. if(klucz_pamieci == -1)
  136. {
  137. printf("Blad tworzenia klucza (producent)\n");
  138. exit(-1);
  139. }
  140. else
  141. printf("Zoastal utworzony klucz: %d (producent)\n", klucz_pamieci);
  142. }
  143.  
  144. static void utworz_nowy_segment_pamieci(void)
  145. {
  146. pamiec = shmget(klucz_pamieci, sizeof(char), IPC_CREAT | 0666);
  147.  
  148. if(pamiec == -1)
  149. {
  150. printf("Problemy z utworzeniem pamieci dzielonej./producent \n");
  151. exit(EXIT_FAILURE);
  152. }
  153. else
  154. printf("Pamiec dzielona zostala utworzona:/producent %d\n",pamiec);
  155.  
  156.  
  157. adres_pamieci = (char *) shmat(pamiec, 0, 0);
  158. if(adres_pamieci == NULL && errno != 0)
  159. {
  160. printf("Nie mozna uzyskac adresu segmentu pamieci. /producent \n");
  161. exit(EXIT_FAILURE);
  162. }
  163. else printf("Uzyskano adres segmentu pamieci. /producent \n");
  164. }
  165.  
  166. static void odlacz_pamiec(void)
  167. {
  168. odlaczenie1=shmctl(pamiec,IPC_RMID,0);
  169. odlaczenie2=shmdt(adres_pamieci);
  170. if (odlaczenie1==-1 || odlaczenie2==-1)
  171. {
  172. printf("Problemy z odlaczeniem pamieci dzielonej.\n");
  173. exit(EXIT_FAILURE);
  174. }
  175. else printf("Pamiec dzielona zostala odlaczona.\n");
  176. }
  177. int main()
  178. {
  179.  
  180. char znak;
  181. FILE *wejscie;
  182.  
  183. utworz_klucz_pamieci_dzielonej();
  184. utworz_nowy_segment_pamieci();
  185. utworz_klucz_semafora();
  186. utworz_nowy_semafor();
  187. ustaw_semafor(0,1);
  188. ustaw_semafor(1,0);
  189. wejscie = fopen("wejscie", "r");
  190.  
  191. if(wejscie == NULL)
  192. {
  193. printf("Nie mozna otworzyc pliku wejscie dla odczytu /producent\n");
  194. exit(EXIT_FAILURE);
  195. }
  196. else
  197. {
  198. while(!feof(wejscie))
  199. {
  200. znak = fgetc(wejscie);
  201.  
  202. if(znak != EOF)
  203. {
  204. semafor_p(0);
  205.  
  206. *adres_pamieci = znak;
  207. printf("Znak = %c, adres pamiec = %c /producent\n",znak,*adres_pamieci);
  208.  
  209. semafor_v(1);
  210. //sleep(1);
  211. }
  212.  
  213. }
  214.  
  215.  
  216. semafor_p(0);
  217.  
  218. *adres_pamieci = EOF;
  219.  
  220. semafor_v(1);
  221. }
  222.  
  223.  
  224. fclose(wejscie);
  225.  
  226. //usun_semafor();
  227. //odlacz_pamiec();
  228. return 0;
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement