Advertisement
Guest User

Untitled

a guest
Jan 29th, 2020
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/msg.h>
  5. #include <stdlib.h>
  6. #include <sys/sem.h>
  7. #include <signal.h>
  8. #include <sys/shm.h>
  9. #include <time.h>
  10.  
  11. int *bufor;
  12.  
  13. key_t key1, key2; // zmienne na klucze
  14.  
  15. int semid;
  16.  
  17. int shmid;
  18.  
  19. int pid1, pid2;
  20.  
  21. struct sembuf buf;
  22.  
  23. void podnies(int semid, int semnum) //podniesienie semafora
  24. {
  25. buf.sem_num = semnum;
  26. buf.sem_op = 1;
  27. buf.sem_flg = 0;
  28. if (semop(semid, &buf, 1) == -1)
  29. {
  30. perror("Podnoszenie semafora");
  31. exit(1);
  32. }
  33. }
  34.  
  35.  
  36. void opusc(int semid, int semnum) //opuszczenie semafora
  37. {
  38. buf.sem_num = semnum;
  39. buf.sem_op = -1;
  40. buf.sem_flg = 0;
  41. if (semop(semid, &buf, 1) == -1)
  42. {
  43. perror("Opuszczenie semafora");
  44. exit(1);
  45. }
  46. }
  47.  
  48. void proces1() //funkcja pierwszego procesu potomnego
  49. {
  50. pid1=getpid();
  51. srand(time(0));
  52. while(1)
  53. {
  54. usleep(rand()%100);
  55. opusc(semid, 2);
  56. printf("K1, odczytuje: %d\n", bufor[0]);
  57. podnies(semid, 0);
  58. }
  59. }
  60.  
  61. void proces2() //funkcja drugiego procesu potomnego
  62. {
  63. pid2=getpid();
  64. srand(time(0));
  65. while(1)
  66. {
  67. usleep(rand()%100);
  68. opusc(semid, 3);
  69. printf("K2, odczytuje: %d\n", bufor[0]);
  70. podnies(semid, 1);
  71. }
  72. }
  73.  
  74. void proces3() //funkcja dla procesu macierzystego
  75. {
  76. int i;
  77.  
  78. for(i=0; i<101; i++)
  79. {
  80. opusc(semid, 0);
  81. opusc(semid, 1);
  82. bufor[0]=i;
  83. printf("Wpisano do shared memory. %d\n", i);
  84. podnies(semid, 2);
  85. podnies(semid, 3);
  86. }
  87. }
  88.  
  89.  
  90. int main()
  91. {
  92. /* Tworzymy klucz dla semaforów */
  93. if ((key1 = ftok(".", 'A')) == -1)
  94. errx(1, "Blad tworzenia klucza!");
  95.  
  96. ////////Deklarujemy tablice 2 semaforow
  97. semid = semget(key1, 4, IPC_CREAT|0600);
  98.  
  99. //Nadajemy wartości semaforom
  100. if (semctl(semid, 0, SETVAL, (int)1) == -1){
  101. perror("Nadanie wartosci semaforowi 0");
  102. exit(1);
  103. }
  104. if (semctl(semid, 1, SETVAL, (int)1) == -1){
  105. perror("Nadanie wartosci semaforowi 1");
  106. exit(1);
  107. }
  108. if (semctl(semid, 2, SETVAL, (int)0) == -1){
  109. perror("Nadanie wartosci semaforowi 2");
  110. exit(1);
  111. }
  112. if (semctl(semid, 3, SETVAL, (int)0) == -1){
  113. perror("Nadanie wartosci semaforowi 3");
  114. exit(1);
  115. }
  116.  
  117. /* Tworzymy klucz dla pamieci wspoldzielonej */
  118. if ((key2 = ftok(".", 'B')) == -1)
  119. errx(1, "Blad tworzenia klucza!");
  120.  
  121. ////////Deklarujemy pamiec wspoldzielona
  122. shmid = shmget(key2, sizeof(int), IPC_CREAT|0600);
  123.  
  124. if (shmid == -1){
  125. perror("Utworzenie segmentu pamieci wspoldzielonej");
  126. exit(1);
  127. }
  128.  
  129. //Pobieramy wskaznik na adres pamieci wspoldzielonej
  130. bufor = shmat(shmid, NULL, 0);
  131.  
  132. if (bufor == NULL){
  133. perror("Przylaczenie segmentu pamieci wspoldzielonej");
  134. exit(1);
  135. }
  136.  
  137. if(fork()==0) //powolanie pierwszego potomka
  138. {
  139. int choice;
  140.  
  141. printf("Wybierz typ inputu:\n");
  142. printf("1. Z klawiatury.\n");
  143. printf("2. Z wybranego pliku.\n");
  144. printf("3. Z pliku dev/urandom.\n");
  145.  
  146. scanf(" %d", &choice);
  147.  
  148. if(choice==1)
  149. {
  150. while(1)
  151. {
  152.  
  153. }
  154. }
  155.  
  156. if(choice==2)
  157. {
  158. while(1)
  159. {
  160.  
  161. }
  162.  
  163. }if(choice==3)
  164. {
  165. while(1)
  166. {
  167.  
  168. }
  169. }
  170. }
  171.  
  172. if(fork()==0) //powolanie drugiego potomka
  173. {
  174. czytaj2();
  175. }
  176.  
  177.  
  178. producent();
  179.  
  180. sleep(20);
  181. kill(pid1, SIGKILL); //posprzatanie po stworzonych procesach
  182. kill(pid2, SIGKILL);
  183. kill(getpid(), SIGKILL);
  184.  
  185.  
  186.  
  187.  
  188. return 0;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement