Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.53 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <sys/stat.h>
  3. #include <signal.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include <fcntl.h>
  7. #include <string.h>
  8. #include <sys/sem.h>
  9. #include <sys/wait.h>
  10.  
  11. int rura[2];
  12. //ID procesów do sygnałow, zatrzymano -> czy byl sygnal stopu
  13. int pid[3];
  14. int zatrzymane = 0;
  15. int semafor; //semafor chroniacy plik
  16.  
  17. void Operacja_sem(int num, int op)
  18. {
  19. //num
  20. //sem0 - blokuje zapis, sem1 - blokuje odczyt
  21. //operacja
  22. //+1 - podnies semafor, -1 - opusc semafor
  23. struct sembuf sem;
  24. sem.sem_op = op;
  25. sem.sem_num = num;
  26.  
  27. if(semop(semafor, &sem, 1) == -1)
  28. semop(semafor, &sem, 1);
  29.  
  30. //Dopóki poprawnie nie wykonasz operacji to ja powtorz
  31. //Czemu ? Bo sygnaly sie nie lubią z tego typu operacjami i jak byś jakiś wysłał jakiś bez tego zabezpieczenia to by proces
  32. //Podniosl/ opuscil raz za duzo semafor i wszystko by diabli wzieli;
  33. }
  34.  
  35. //na poczatku sytuacja wyglada tak:
  36. //p1 zna kazdego
  37. //p2 zna tylko p3
  38. //p3 nie zna nikogo
  39.  
  40. //DO sygnalow potrzebne sa pozostale PID-y - rozeslemy je przez queue - mechanizmem do sygnalow
  41.  
  42. void p1()
  43. {
  44. pid[0] = getpid();
  45.  
  46. //wysyla swoj pod do p2 przez rure
  47. char pidP1[10];
  48. sprintf(pidP1, "%d", getpid());
  49. write(rura[1], pidP1, sizeof(pidP1));
  50.  
  51. char odczyt;
  52.  
  53. while(1)
  54. {
  55. while(zatrzymane);
  56. //wysylamy po jednym znaku, czytamy ze standardowego wejscia
  57. if(fread(&odczyt, 1, 1, stdin))
  58. {
  59. //rura sie domyslnie samo synchronizuje
  60. write(rura[1], &odczyt, 1); //WYslij wiadomosc przez fifo do P2
  61. }
  62. }
  63. }
  64.  
  65.  
  66.  
  67.  
  68.  
  69. void proc1()
  70. {
  71. pid[0] = getpid();
  72.  
  73. //wysyla swoj pod do p2 przez rure
  74. //char pidP1[10];
  75. //sprintf(pidP1, "%d", getpid());
  76. //write(rura[1], pidP1, sizeof(pidP1));
  77.  
  78. char odczyt[0];
  79.  
  80. while(1)
  81. {
  82. while(zatrzymane);
  83. //wysylamy po jednym znaku, czytamy ze standardowego wejscia
  84. if(fread(&odczyt, 1, 1, stdin))
  85. {
  86. Operacja_sem(0, -1);
  87. FILE *plik = fopen("plik", "w"); // Otworz plik do zapisu
  88. fwrite(odczyt, 1, 1, plik); // Zapisz do pliku
  89. fclose(plik);
  90. Operacja_sem(1, 1);
  91. printf("Wczytalem znak : %c", odczyt[0]);
  92. }
  93. }
  94. }
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111. void p2()
  112. {
  113. pid[1] = getpid();
  114.  
  115. //odbiera pid p1
  116. char pidP1[10];
  117. read(rura[0], &pidP1, sizeof(pidP1));
  118. pid[0] = atoi(pidP1);
  119.  
  120. //wysyla plikiem pid do p3
  121. Operacja_sem(0, -1);
  122. FILE *plik = fopen("plik", "w"); // Otworz plik do zapisu
  123. fwrite(pidP1, 10, 10, plik); // Zapisz do pliku
  124. fclose(plik);
  125. Operacja_sem(1, 1);
  126.  
  127. sprintf(pidP1, "%d", getpid());
  128.  
  129. Operacja_sem(0, -1);
  130. plik = fopen("plik", "w"); // Otworz plik do zapisu
  131. fwrite(pidP1, 10, 10, plik); // Zapisz do pliku
  132. fclose(plik);
  133. Operacja_sem(1, 1);
  134.  
  135.  
  136. int i = 0;
  137. char odczyt;
  138. while(1)
  139. {
  140. while(zatrzymane);
  141.  
  142. if(read(rura[0], &odczyt, 1)) //odczyt pipe
  143. {
  144. //zamienia odebrany znak na hex
  145. char hex[3];
  146. sprintf(hex, "%02x ", (unsigned char) odczyt);
  147.  
  148.  
  149. //wysyla znak do p3
  150. Operacja_sem(0, -1);
  151. plik = fopen("plik", "w"); // Otworz plik do zapisu
  152. fwrite(hex, 3, 3, plik); // Zapisz do pliku
  153. fclose(plik);
  154. Operacja_sem(1, 1);
  155.  
  156. //jak wyslales 15 znakow lub trafiles na enter - wyslij enter
  157. if(i++ == 14 || odczyt == '\n')
  158. {
  159. i = 0;
  160. Operacja_sem(0, -1);
  161.  
  162. FILE *plik = fopen("plik", "w"); // Otworz plik do zapisu
  163. fwrite(" \n", 3, 3, plik); // Zapisz do pliku
  164. fclose(plik);
  165.  
  166. Operacja_sem(1, 1);
  167. }
  168. }
  169. }
  170. }
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181. void proc2()
  182. { /*
  183. pid[1] = getpid();
  184.  
  185. //odbiera pid p1
  186. char pidP1[10];
  187. read(rura[0], &pidP1, sizeof(pidP1));
  188. pid[0] = atoi(pidP1);
  189.  
  190. //wysyla plikiem pid do p3
  191. Operacja_sem(0, -1);
  192. FILE *plik = fopen("plik", "w"); // Otworz plik do zapisu
  193. fwrite(pidP1, 10, 10, plik); // Zapisz do pliku
  194. fclose(plik);
  195. Operacja_sem(1, 1);
  196.  
  197. sprintf(pidP1, "%d", getpid());
  198.  
  199. Operacja_sem(0, -1);
  200. plik = fopen("plik", "w"); // Otworz plik do zapisu
  201. fwrite(pidP1, 10, 10, plik); // Zapisz do pliku
  202. fclose(plik);
  203. Operacja_sem(1, 1);
  204. */
  205.  
  206. char odczyt[0];
  207. while(1)
  208. {
  209. while(zatrzymane);
  210.  
  211. Operacja_sem(1, -1); // Opusc semafor do czytania
  212. FILE *plik = fopen("plik", "r"); // Otworz plik do czytania
  213. if(fread(odczyt, 1, 1, plik)) //odczyt pipe
  214. {
  215. //zamienia odebrany znak na hex
  216. char hex[3];
  217. sprintf(hex, "%02x ", (unsigned char) odczyt);
  218.  
  219.  
  220. //wysyla znak do p3
  221. write(rura[1], hex, sizeof(hex));
  222.  
  223. fclose(plik); //Zamknij plik
  224. Operacja_sem(0, 1); // Podnies semafor do pisania
  225. }
  226. }
  227. }
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244. void p3()
  245. {
  246. char pidP[10];
  247.  
  248. Operacja_sem(1, -1); // Opusc semafor do czytania
  249. FILE *plik = fopen("plik", "r"); // Otworz plik do czytania
  250. fread(pidP, 10, 10, plik); // Czytaj
  251. fclose(plik); //Zamknij plik
  252. Operacja_sem(0, 1); // Podnies semafor do pisania
  253. pid[0] = atoi(pidP);
  254.  
  255. Operacja_sem(1, -1); // Opusc semafor do czytania
  256. plik = fopen("plik", "r"); // Otworz plik do czytania
  257. fread(pidP, 10, 10, plik); // Czytaj
  258. fclose(plik); //Zamknij plik
  259. Operacja_sem(0, 1); // Podnies semafor do pisania
  260. pid[1] = atoi(pidP);
  261.  
  262. pid[2] = getpid();
  263.  
  264. char odczyt[3];
  265. while(1)
  266. {
  267. while(zatrzymane);
  268.  
  269. Operacja_sem(1, -1); // Opusc semafor do czytania
  270. plik = fopen("plik", "r"); // Otworz plik do czytania
  271. fread(odczyt, 3, 3, plik); // Czytaj
  272. fclose(plik); //Zamknij plik
  273. Operacja_sem(0, 1); // Podnies semafor do pisania
  274.  
  275. fprintf(stdout, "%s", odczyt); // Wydrukuj na strumień standardowy
  276. fflush(stdout); //wymus wyczyszczenie bufora
  277.  
  278. }
  279. }
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291. void proc3()
  292. { /*
  293. char pidP[10];
  294.  
  295. Operacja_sem(1, -1); // Opusc semafor do czytania
  296. FILE *plik = fopen("plik", "r"); // Otworz plik do czytania
  297. fread(pidP, 10, 10, plik); // Czytaj
  298. fclose(plik); //Zamknij plik
  299. Operacja_sem(0, 1); // Podnies semafor do pisania
  300. pid[0] = atoi(pidP);
  301.  
  302. Operacja_sem(1, -1); // Opusc semafor do czytania
  303. plik = fopen("plik", "r"); // Otworz plik do czytania
  304. fread(pidP, 10, 10, plik); // Czytaj
  305. fclose(plik); //Zamknij plik
  306. Operacja_sem(0, 1); // Podnies semafor do pisania
  307. pid[1] = atoi(pidP);
  308.  
  309. pid[2] = getpid();
  310. */
  311. char odczyt[3];
  312. int i = 0;
  313. while(1)
  314. {
  315. while(zatrzymane);
  316.  
  317. if(read(rura[0], &odczyt, 3)) //odczyt pipe
  318. {
  319. fprintf(stdout, "%s", odczyt); // Wydrukuj na strumień standardowy
  320. fflush(stdout); //wymus wyczyszczenie bufora
  321. if(x++ == 14){
  322. printf("\n");
  323. x = 0;
  324. }
  325.  
  326. }
  327. }
  328. }
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345. /*
  346. * jest 6 sygnalow. Podstawowe i wtorne
  347. * Podstawowe wysyla uzytkownik
  348. *
  349. * W przypadku otrzymania podstawowego sygnalu nalezy go zamienic na wtorny i obsluzyc
  350. * W przypadku wtornego, tylko obsluzyc
  351. *
  352. * NP.
  353. * P1 dostaje stop (10)
  354. * P1 rozsyla sygnal 18
  355. * P1 obsluguje 10 (zatrzymuje sie)
  356. *
  357. * P2 dostaje 18
  358. * P2 obsluguje 18 (zatrzymuje sie)
  359. *
  360. * Bez tej 18 procesy by zaczely grac w ping ponga
  361. */
  362. void sygnalOdb(int sygnal)
  363. {
  364. if(sygnal < 13) //2,10,12 -> procesy pierwotne
  365. {
  366. int sygnal2;
  367.  
  368. if(sygnal == 2) //sygnal numer 2 "zamienia sie" w 14
  369. sygnal2 = 14;
  370. else if(sygnal == 10)
  371. sygnal2 = 18;
  372. else if(sygnal == 12)
  373. sygnal2 = 20;
  374.  
  375. for(int i = 0; i < 3; i++) //wyslij wtorny do kazdego oprocz siebie
  376. if(pid[i] != getpid())
  377. kill(pid[i], sygnal2);
  378. }
  379.  
  380. for(int i = 0; i < 3; i++) //obsluga sygnalow
  381. if(pid[i] == getpid()) //jak nie jestes matka
  382. {
  383. if(sygnal == 2 || sygnal == 14) //jak 2 lub 14 to zakoncz itd.
  384. exit(3);
  385. else if(sygnal == 10 || sygnal == 18) //stop
  386. zatrzymane = 1;
  387. else if(sygnal == 12 || sygnal == 20) //wznow
  388. zatrzymane = 0;
  389. }
  390. }
  391.  
  392. int main(void)
  393. {
  394. //tworze pipe
  395. pipe(rura);
  396.  
  397. //TWorze tablice semaforow
  398. semafor = semget(7777, 2, 0777 | IPC_CREAT);
  399.  
  400. //UStawiam numerSygi poczatkowe semaforow - mozna pisac, nie mozna czytac
  401. semctl(semafor, 0, SETVAL, 1);
  402. semctl(semafor, 1, SETVAL, 0);
  403.  
  404. //rejestracja sygnalow
  405. signal(2, sygnalOdb);
  406. signal(10, sygnalOdb);
  407. signal(12, sygnalOdb);
  408. signal(18, sygnalOdb);
  409. signal(14, sygnalOdb);
  410. signal(20, sygnalOdb);
  411.  
  412. if((pid[2] = fork()) == 0) // PROCES 3
  413. {
  414. p3();
  415. }
  416.  
  417. if((pid[1] = fork()) == 0) // P2
  418. {
  419. p2();
  420. }
  421.  
  422. if((pid[0] = fork()) == 0) // P1
  423. {
  424. p1();
  425. }
  426.  
  427. //czekaj na koneic dzialania
  428. waitpid(pid[0], NULL, 0);
  429. waitpid(pid[1], NULL, 0);
  430. waitpid(pid[2], NULL, 0);
  431.  
  432. //Usuwanie semaforów
  433. semctl(semafor, 0, IPC_RMID);
  434. //usun plik
  435. remove("plik");
  436.  
  437. return 0;
  438. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement