Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.58 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/sem.h>
  5. #include <sys/shm.h>
  6. #include <signal.h>
  7. #include <sys/wait.h>
  8. #include <unistd.h>
  9. #include <sys/stat.h>
  10. #include <fcntl.h>
  11. #include <sys/msg.h>
  12.  
  13. int pidy[3] = {0, 0, 0}; // Pidy P1 , P2 , P3
  14. int P1doP2[2]; // pipe'y do komunikacji
  15. int P2doP3[2]; // pipe'y do komunikacji
  16. int Queue; // kolejka do wysylania sygnalow
  17. int czykoniecpliku =1;
  18. int stop = 0; // Zmienna odpowiadajaca za wymiane dane
  19. FILE *fp;
  20.  
  21. #define idKolejki 50 // Klucz id dla kolejki
  22.  
  23.  
  24. typedef struct msgbuf{ // struktura kolejki - typ wiadomosci, tresc
  25. long typ;
  26. int tresc;
  27. } w;
  28.  
  29.  
  30. int sem_utworz(int keynb){
  31. key_t semkey = ftok(".", keynb);
  32. int semid = semget(semkey, 1, IPC_CREAT | 0666);
  33. return semid;
  34. }
  35. void sem_usun(int semid){
  36. semctl(semid, 0, IPC_RMID);
  37. }
  38.  
  39. void sem_podnies(int semid){
  40. struct sembuf podnies = { 0, 1, 0 };
  41. semop(semid, &podnies, 1);
  42. }
  43. void sem_opusc(int semid){
  44. struct sembuf opusc = { 0, -1, 0 };
  45. semop(semid, &opusc, 1);
  46. }
  47.  
  48. void piszdokolejki(int tresc) // Funkcja piszaca do kolejki
  49. {
  50. w wiad;
  51. wiad.typ = 1;
  52. wiad.tresc = tresc; // Nr sygnalu lub PID ktory na poczatku dzialania wysyla matka
  53. msgsnd(Queue, &wiad, 1, IPC_NOWAIT);
  54. }
  55.  
  56. void odczytajzkolejki() // ODczytaj z kolejki swoja wiadomosc
  57. {
  58. w wiad;
  59. msgrcv(Queue, &wiad, sizeof(wiad.tresc), 1, 0);
  60. //return wiad.tresc;
  61. }
  62.  
  63. void proces1()
  64. {
  65.  
  66.  
  67. char wiadomosc[128]; // Tu zapiszemy nasza wiadomosc w postaci liczb.
  68. int i = 0;
  69. while(czykoniecpliku)
  70. {
  71. for(i = 0; i < 128; i++)
  72. wiadomosc[i] = 0;
  73. // fgets pracuje do odczytania 32 znakow lub trafienia na '\n'
  74. if(fgets(wiadomosc, 128, stdin) == NULL) // jesli fgets zwrocil NULL tzn ze plik sie skonczyl
  75. czykoniecpliku = 0;
  76.  
  77. if(czykoniecpliku) // Jesli plik sie nie skonczyl
  78. write(P1doP2[1], wiadomosc, sizeof(wiadomosc)); // Wyslij paczke do P2
  79.  
  80. while(stop); // Jak wstrzymamy procesy sygnalem to tu sie zatrzymaja
  81. }
  82. // Jesli wyszlismy z petli tzn, ze plik sie skonczyl. Wysylac -1 poinformujemy o tym reszte
  83. wiadomosc[0] = -1;
  84. write(P1doP2[1], wiadomosc, sizeof(wiadomosc));
  85.  
  86.  
  87.  
  88.  
  89.  
  90. }
  91. void proces2()
  92. {
  93. int semid1 = sem_utworz(0);
  94. int semid2 = sem_utworz(1);
  95.  
  96.  
  97. char wiadomosc[128];
  98. while(czykoniecpliku)
  99. {
  100. read(P1doP2[0], wiadomosc, sizeof(wiadomosc)); //Odczytaj to co wyslal P1
  101.  
  102. if(wiadomosc[0] == -1) // Sprawdz czy to koniec
  103. czykoniecpliku = 0;
  104. //int liczbabajtow = strlen(wiadomosc);
  105. //fprintf(stderr, "%d\n", liczbabajtow);
  106. sem_podnies(semid1);
  107. fp=fopen("test.txt", "w");
  108. fprintf (fp, "%s", wiadomosc);
  109. fclose (fp);
  110. sem_opusc(semid2);
  111.  
  112.  
  113.  
  114.  
  115. //printf("%s",wiadomosc);
  116. //write(P2doP3[1], wiadomosc, sizeof(wiadomosc)); // Wyslij pake do P3
  117. while(stop);
  118. }
  119. wiadomosc[0] = -1;
  120. sem_podnies(semid1);
  121. fp=fopen("test.txt", "w");
  122. fprintf (fp, "%s", wiadomosc);
  123. fclose (fp);
  124. sem_opusc(semid2);
  125. //write(P2doP3[1], wiadomosc, sizeof(wiadomosc));
  126. //printf("%s",wiadomosc);
  127.  
  128.  
  129. }
  130. void proces3()
  131. {
  132. int semid1 = sem_utworz(0);
  133. int semid2 = sem_utworz(1);
  134.  
  135.  
  136. char wiadomosc[128];
  137. pidy[2] = getpid();
  138.  
  139.  
  140.  
  141. while(czykoniecpliku)
  142. {
  143. //read(P2doP3[0], wiadomosc, sizeof(wiadomosc));
  144. sem_podnies(semid2);
  145. fp=fopen("test.txt", "r");
  146. fgets(wiadomosc, 128, fp);
  147. fclose (fp);
  148. sem_opusc(semid1);
  149.  
  150. printf("%s",wiadomosc);
  151. if(wiadomosc[0] == -1)
  152. czykoniecpliku = 0;
  153.  
  154. while(stop);
  155. }
  156. printf("%s",wiadomosc);
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163. }
  164.  
  165. int main(void){
  166.  
  167. pipe(P1doP2); // TWorzymy rury, kolejke komunikatow
  168. pipe(P2doP3);
  169. Queue = msgget(idKolejki, 0666 | IPC_CREAT);
  170.  
  171. int semid1 = sem_utworz(0);
  172. int semid2 = sem_utworz(1);
  173. semctl(semid1, 0, SETVAL, 0);
  174.  
  175.  
  176.  
  177.  
  178. if((pidy[2] = fork()) == 0) // P3
  179. {
  180. pidy[2] = getpid();
  181. proces3();
  182. return 0;
  183. }
  184.  
  185. if((pidy[1] = fork()) == 0) // P2
  186. {
  187. pidy[1] = getpid();
  188. proces2();
  189. return 0;
  190. }
  191.  
  192. if((pidy[0] = fork()) == 0) // P1
  193. {
  194. pidy[0] = getpid();
  195. proces1();
  196. return 0;
  197. }
  198.  
  199.  
  200.  
  201. //Czekamy na zakonczenie działania forków
  202. waitpid(pidy[2], NULL, 0);
  203. waitpid(pidy[1], NULL, 0);
  204. waitpid(pidy[0], NULL, 0);
  205.  
  206. printf("\nProcesy - forki zakonczyly prace");
  207. //Usuwamy kolejkę , pipe'y
  208. msgctl(Queue, IPC_RMID, NULL);
  209. close(P1doP2[0]);
  210. close(P1doP2[1]);
  211. close(P2doP3[0]);
  212. close(P2doP3[1]);
  213.  
  214. semctl(semid1, 0, IPC_RMID);
  215. semctl(semid2, 1, IPC_RMID);
  216.  
  217.  
  218.  
  219.  
  220. return 0;
  221.  
  222.  
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement