Advertisement
Guest User

Untitled

a guest
Jan 28th, 2020
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 17.69 KB | None | 0 0
  1. #include "stdio.h"
  2.  
  3. #include "fcntl.h"
  4. #include "unistd.h"
  5. #include "stdlib.h"
  6. #include "errno.h"
  7. #include "wait.h"
  8. #include "signal.h"
  9. #include "string.h"
  10. #include "sys/errno.h"
  11. #include "sys/ipc.h"
  12. #include "sys/shm.h"
  13. #include "sys/sem.h"
  14.  
  15. #define ROZPIAR_BUFORA 200
  16. /* Ideks łącza, którym proces 1 przesyła dane do procesu 2 */
  17. #define PIPE1_2 0
  18.  
  19. /* Ideks łącza, którym proces 2 przesyła dane do procesu 3 */
  20. #define PIPE2_3 1
  21.  
  22. /* Ideks FD przeznaczanego do odczytu w tablicy "zwracanej" przez funkcję pipe.*/
  23. #define FD_DO_ODCZYTU 0
  24.  
  25. /* Ideks FD przeznaczanego do zapisu w tablicy "zwracanej" przez funkcję pipe.*/
  26. #define FD_DO_ZAPISU 1
  27.  
  28. /* Definiujemy jakie sygnały używany w roli sygnałów s1-s4 z zadania */
  29. #define S1 SIGINT
  30. #define S2 SIGUSR1
  31. #define S3 SIGCONT
  32. #define S4 SIGUSR2
  33.  
  34. /* Bufor operacji semaforowych */
  35. static struct sembuf buf;
  36.  
  37. /* Tablica pomocnicza przy konwersji wartości bajtów na zapis heksadecymalny */
  38. char pomocniczaHEX[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
  39.  
  40. /* Zamykanie deksryptora pliku ponawiające tą czynność w momencie otrzymania sygnału */
  41. void zamknijFd(int fd){
  42.     int rc;
  43. ponow:
  44.     rc = close(fd);
  45.     if(rc == -1 ) {
  46.         if(errno == EINTR)
  47.             goto ponow;
  48.         else
  49.         {
  50.             perror("clode fd");
  51.             exit(1);
  52.         }
  53.     }
  54. }
  55.  
  56. /* Klucz szyfrowania przy użyciu funkcji XOR*/
  57. #define KLUCZ 1
  58.  
  59. /* Podnisznie semafora o n z ponawianiem gdy operacja się nie uda */
  60. void podniesN(int semid, int semnum, int n)
  61. {
  62.     buf.sem_num = semnum;
  63.     buf.sem_op = n;
  64.     buf.sem_flg = 0;
  65. ponow:
  66.     if (semop(semid, &buf, 1) == -1)
  67.     {
  68.         if(errno == EINTR)
  69.             goto ponow;
  70.         else {
  71.             perror("semsignal");
  72.             exit(1);
  73.         }
  74.     }
  75. }
  76.  
  77. /* Pełni funkcję analogiczną do podniesN tylko dla opuszczania a nie podnoszenia seamfora */
  78. void opuscN(int semid, int semnum, int n)
  79. {
  80.     buf.sem_num = semnum;
  81.     buf.sem_op = -n;
  82.     buf.sem_flg = 0;
  83. ponow:
  84.     if (semop(semid, &buf, 1) == -1)
  85.     {
  86.         if(errno == EINTR)
  87.             goto ponow;
  88.         else {
  89.             perror("semwait");
  90.             exit(1);
  91.         }
  92.     }
  93. }
  94.  
  95. /* Podnoszenie semafora(o 1) i ponawianie tej operacji w przypadku gdy przerwie ją sygnal w
  96. każdym przeciwnym wypadku wyświtlamy błąd */
  97. void podnies(int semid, int semnum)
  98. {
  99.     podniesN(semid, semnum, 1);
  100. }
  101.  
  102. /* Opuszczanie semafora z rekacją na sygnał jak w funkcjach powyżej*/
  103. void opusc(int semid, int semnum)
  104. {
  105.     opuscN(semid, semnum, -1);
  106. }
  107.  
  108. /* Zamyka podane jako agrmunet łącza nienazwane */
  109. void zamknijPipy(int fds[2][2])
  110. {
  111.     zamknijFd(fds[0][0]);
  112.     zamknijFd(fds[0][1]);
  113.     zamknijFd(fds[1][0]);
  114.     zamknijFd(fds[1][1]);
  115. }
  116.  
  117. /* Funckja realizuje zadnia procesu 1 z polecenia */
  118. void proces1();
  119.  
  120. /* Funkcja realizuje zadania procesu 2 z polecenie */
  121. void proces2();
  122.  
  123. /* Funkcja realizuje zadania procesu 3 z polecenia */
  124. void proces3();
  125.  
  126. int fifo12[2], fifo23[2];
  127.  
  128. /* Procedura obsługi sygnałów S1-S3*/
  129. void s123Obsluga(int signum);
  130.  
  131. /* Procedura obsługi sygnału S4*/
  132. void s4Oblusga();
  133.  
  134. /* Funkcja realizująca implementację prostego szyfrowania przy użyciu szyfru cesara */
  135. size_t zaszyfrujCesar(char* wiadomosc, char klucz, size_t rozmiar);
  136.  
  137. /* Konwertuje ciąg wejście na zapis jego kolejnych bajtów postaci heksadecymalnej, bajty oddzeilone spacjami
  138.    UWAGA wyjscie musi miec rozmiar minimum rozmiarWejscia*3+1*/
  139. size_t konwersjaHex(char* wejscie, char* wyjscie, int rozmiarWejscia);
  140.  
  141. /* Zapisuje do łącza nienazwanego standardową wiadomocs dla tego programu tj dlugosc ciagu znakow jako typ int
  142. a nastepnie sam ciąg nie zakończony \0 z uwagi na to, że dane mogą zawierać bajty niedrukwoalne w tym \0, więc
  143. nie mogę na nim polegać w celu określenia długości ciągu. Funkcja ponawia trasfer jeśli zostanie on przerwany
  144. przez sygnał */
  145. void zapiszStandardowaWiadomosc(int fd, char* wejscie, int rozmiar);
  146.  
  147. /* Odczytuje wiadomość w postaci opisanej przy funkcji zapiszStandardowaWiadomosc. Reakcja na sygnały analogiczna
  148. jak wyżej*/
  149. void odczytajStandardowaWiadomosc(int fd, char* wyjscie, int* rozmiarWyjscia, int rozmiar);
  150. /* Id pamieci dizelonej przewującej kolejno pidy procesów P1-P3 a następnie stan programu, wartość używaną w celu
  151. przekazywania między procesami informacji o komendzie operatora */
  152. int shmid;
  153. /* Zestaw semaforow do synchornizowania dostępu do opisanej wyzej pamięci */
  154. int semid;
  155. /* Pod ten adres przyłączona jest tablica PIDów*/
  156. int *pidy;
  157. /* Pod ten adres przyłączamy komunikat o żądanym przez opertora działaniu */
  158. int *komunikat;
  159. /* Opis zastosowania kolenych semaforów w zestawie */
  160. #define S_USTALONO_SHM 0
  161. #define S_ZAPISZ_KOMUNIKAT 1
  162. #define S_P1_ODCZYTAJ_KOMUNIKAT 2
  163. #define S_P2_ODCZYTAJ_KOMUNIKAT 3
  164. #define S_P3_ODCZYTAJ_KOMUNIKAT 4
  165.  
  166. /* Wartości dla pola komunikat w pamięci dzielonej */
  167. #define K_KONTYNUUJ S3
  168. #define K_ZATRZYMAJ S2
  169. #define K_ZAKONCZ   S1
  170.  
  171. /* Domyślnym stanem jest K_KONTYNUUJ czyli kontyowanie normalnej operacji
  172. programu */
  173. int stanProcesu = K_KONTYNUUJ;
  174.  
  175. /* Maska sygnałów, na kutórej oczekują procesy, które wstrzymały komunikacje na
  176. rządanie operatora */
  177. sigset_t mask;
  178.  
  179. int main()
  180. {
  181.     /* Ignoruję sygnał sigint w procesie inicjalizującym celem tego zabiegu jest to aby jeśli w konsoli nacisniemy ctrl+Z
  182.     sygnał ten został przekazanyc do procesów 1-3 które poprawnie zakończą pracę po czym cały program zakończy prację */
  183.     signal(SIGINT, SIG_IGN);
  184.     /* Tworzę maskę do oczekiwania procesów po otrzymaniu sygnału S2(Wstzymanie komunikacji)*/
  185.     sigfillset (&mask);
  186.     sigdelset(&mask, S1);
  187.     sigdelset(&mask, S2);
  188.     sigdelset(&mask, S3);
  189.     sigdelset(&mask, S4);
  190.     /* Przechowuje deskryptory do pipów utworzonych przez proces inicjalizujący komunikujące się procesy */
  191.     int fifoFds[2][2];
  192.     /* Tworze pipa do komunikacji 1->2 */
  193.     int pid1,pid2,pid3;
  194.     if(pipe(fifoFds[PIPE1_2]) != 0)
  195.     {
  196.         perror("Tworzenie fifo 1->2");
  197.         exit(1);
  198.     }
  199.  
  200.     /* Tworże pipa do komunikacji 2->2*/
  201.     if(pipe(fifoFds[PIPE2_3]) != 0)
  202.     {
  203.         zamknijFd(fifoFds[PIPE1_2][FD_DO_ODCZYTU]);
  204.         zamknijFd(fifoFds[PIPE1_2][FD_DO_ZAPISU]);
  205.         perror("Tworzenie fifo 2->3");
  206.         exit(1);
  207.     }
  208.  
  209.     /* Tworzę zestaw semaforów do synchronizacni dostępu do pamięci dzielonej */
  210.     semid = semget(IPC_PRIVATE, 5, 0600 | IPC_CREAT);
  211.     if (semid == -1){
  212.         perror("Uzyskanie identyfikatora tablicy semaforow");
  213.         exit(1);
  214.     }
  215.  
  216.     /* Tworzę pamięć dzieloną na pidy i komunikat */
  217.     shmid = shmget(IPC_PRIVATE, 4*sizeof(int), 0600 |IPC_CREAT);
  218.     if (shmid == -1){
  219.         perror("Utworzenie segmentu pamieci wspoldzielonej");
  220.         exit(1);
  221.     }
  222.  
  223.     /* Ustalam wartości domyślne semaforów */
  224.     /* Ten semafor informuje procesy 1-3, że proces inicjalizujący wypełnił już tablicę pidów
  225.     poprawnymi wartościami */
  226.     if (semctl(semid, S_USTALONO_SHM, SETVAL, (int)0) == -1){
  227.         perror("Nadanie wartosci semaforowi 0");
  228.         exit(1);
  229.     }
  230.  
  231.     /* Następne semafory synchronizują dostęp do komunikatu w pamięci dzielonej,
  232.     nazwy opisują role w tym dostępnie konkretnych semaforóœ */
  233.     if (semctl(semid, S_ZAPISZ_KOMUNIKAT, SETVAL, (int)2) == -1){
  234.         perror("Nadanie wartosci semaforowi 0");
  235.         exit(1);
  236.     }
  237.  
  238.     if (semctl(semid, S_P1_ODCZYTAJ_KOMUNIKAT, SETVAL, (int)0) == -1){
  239.         perror("Nadanie wartosci semaforowi 0");
  240.         exit(1);
  241.     }
  242.  
  243.     if (semctl(semid, S_P2_ODCZYTAJ_KOMUNIKAT, SETVAL, (int)0) == -1){
  244.         perror("Nadanie wartosci semaforowi 0");
  245.         exit(1);
  246.     }
  247.  
  248.     if (semctl(semid, S_P3_ODCZYTAJ_KOMUNIKAT, SETVAL, (int)0) == -1){
  249.         perror("Nadanie wartosci semaforowi 0");
  250.         exit(1);
  251.     }
  252.  
  253.     /* Przyłączam pamięc dzieloną i ustawiam wskaźniki na odpowiednie adresy */
  254.     pidy = (pid_t*)shmat(shmid, NULL, 0600 | IPC_CREAT);
  255.     if (pidy == NULL){
  256.         perror("Przylaczenie segmentu pamieci wspoldzielonej");
  257.         exit(1);
  258.     }
  259.     komunikat = pidy + 3;
  260.  
  261.     /* Tworzę procesy 1-3 i uruchamiam odpowiednie funkcje wyousując w razie potrzeby informacje
  262.     o błędach, które wsytąpiły. */
  263.     int zwrFork = fork();
  264.     if(zwrFork < 0)
  265.     {
  266.         zamknijPipy(fifoFds);
  267.         perror("Tworzenie procesu 1");
  268.         exit(1);
  269.     }
  270.     else if (zwrFork == 0)
  271.     {
  272.         proces1(fifoFds[PIPE1_2]);
  273.         return 0;
  274.     }
  275.     else
  276.     {
  277.         pid1 = zwrFork;
  278.     }
  279.  
  280.     zwrFork = fork();
  281.     if(zwrFork < 0)
  282.     {
  283.         zamknijPipy(fifoFds);
  284.         kill(pid1, SIGTERM);
  285.         perror("Tworzenie procesu 2");
  286.         exit(1);
  287.     } else if (zwrFork == 0)
  288.     {
  289.         proces2(fifoFds[PIPE1_2], fifoFds[PIPE2_3]);
  290.         return 0;
  291.     }
  292.     else
  293.     {
  294.         pid2 = zwrFork;
  295.     }
  296.  
  297.     zwrFork = fork();
  298.     if(zwrFork < 0)
  299.     {
  300.         zamknijPipy(fifoFds);
  301.         kill(pid1, SIGTERM);
  302.         kill(pid2, SIGTERM);
  303.         perror("Tworzenie procesu 3");
  304.         exit(1);
  305.     } else if (zwrFork == 0)
  306.     {
  307.         proces3(fifoFds[PIPE2_3]);
  308.         return 0;
  309.     }
  310.     else
  311.     {
  312.         pid3 = zwrFork;
  313.     }
  314.     /* Inicjalizuję zawartość pamięci dzielonej zgodnie z opisem wyżej */
  315.     pidy[0] = pid1;
  316.     pidy[1] = pid2;
  317.     pidy[2] = pid3;
  318.     *komunikat = K_KONTYNUUJ;
  319.     /* I informuje o jej uzupełnineiu procesy P1-P3 */
  320.     podniesN(semid, S_USTALONO_SHM, 3);
  321.  
  322.     /* Czekam na zakończonie procesów 1-3 */
  323.     wait(0);
  324.     wait(0);
  325.     wait(0);
  326.     /* Sprzątam po mechanizmach komunikacji międzyprocesowej */
  327.     close(fifoFds[0][0]);
  328.     close(fifoFds[0][1]);
  329.     close(fifoFds[1][0]);
  330.     close(fifoFds[1][1]);
  331.     /*usuwam zestaw semaforów */
  332.     if(semctl(semid, 0, IPC_RMID, 0) == -1)
  333.     {
  334.         perror("semrm");
  335.     }
  336.     if(shmdt(pidy) == -1) {
  337.         perror("shmdt");
  338.     }
  339.     if(shmctl(shmid, IPC_RMID, 0) == -1) {
  340.         perror("shmrm");
  341.     }
  342.     printf("Wszystkie procesy zakonczyly prace.\n");
  343.     return 0;
  344. }
  345.  
  346. void proces1(int fifo12[2])
  347. {
  348.     /* Proces startuje i wyspisuje swój pid */
  349.     printf("Proces 1 wystartowal %d\n", getpid());
  350.     fflush(stdout);
  351.     zamknijFd(fifo12[FD_DO_ODCZYTU]);
  352.     char buforOdczytu[ROZPIAR_BUFORA];
  353.     int ileOdczytano;
  354.     /*Oczekujemy na zainicjowanie tablicy w shm poprawnymi wartościami przez proces inicjalizujący */
  355.     opusc(semid, S_USTALONO_SHM);
  356.     /* Ustawiam procedury obsługi sygnałów */
  357.     signal(S1, s123Obsluga);
  358.     signal(S2, s123Obsluga);
  359.     signal(S3, s123Obsluga);
  360.     signal(S4, s4Oblusga);
  361.  
  362.     while(1)
  363.     {    
  364.         /*Odczytuję do bufora dane ze standardowego wejścia(jego deskryptor to 0) używając tej samej
  365.         metody "radzenia sobie" z sygnałami jak dla łączy*/
  366. ponowOdczyt:
  367.         if(((ileOdczytano=read(0, buforOdczytu, ROZPIAR_BUFORA)))== -1) {
  368.             if(errno == EINTR) {
  369.                
  370.                 goto ponowOdczyt;
  371.             } else {
  372.                 perror("write");
  373.                 exit(1);
  374.             }
  375.         }
  376.         ;
  377.         /* I przekazuje je przez łącze nienazwane do procesu 2*/
  378.         zapiszStandardowaWiadomosc(fifo12[FD_DO_ZAPISU],buforOdczytu, ileOdczytano);
  379.        
  380.     }
  381.     exit(0);
  382. }
  383.  
  384. void proces2(int fifo12[2], int fifo23[2])
  385. {
  386.     /* Zachowanie analogiczne jak proces 1*/
  387.     printf("Proces 2 wystartowal %d\n", getpid());
  388.     fflush(stdout);
  389.     zamknijFd(fifo12[FD_DO_ZAPISU]);
  390.     zamknijFd(fifo23[FD_DO_ODCZYTU]);
  391.     char buforOdczytu[ROZPIAR_BUFORA];
  392.     int ileOdczytano = 0;
  393.     opusc(semid, S_USTALONO_SHM);
  394.     signal(S1, s123Obsluga);
  395.     signal(S2, s123Obsluga);
  396.     signal(S3, s123Obsluga);
  397.     signal(S4, s4Oblusga);
  398.  
  399.     while(1)
  400.     {
  401.         /* Odczytuje dane od procesu 1 przez pipe */  
  402.         odczytajStandardowaWiadomosc(fifo12[FD_DO_ODCZYTU], buforOdczytu, &ileOdczytano, ROZPIAR_BUFORA);
  403.         /* Dokonuję szyforwania przy użyciu funkcji xor zapisując pozycję klucza */
  404.         zaszyfrujCesar(buforOdczytu, KLUCZ, ileOdczytano);
  405.         /* I wynik tego szyfrowania przekuję do procesu przez odpowiednie łącze nienazwane */
  406.         zapiszStandardowaWiadomosc(fifo23[FD_DO_ZAPISU],buforOdczytu, ileOdczytano);
  407.        
  408.     }
  409.     exit(0);
  410. }
  411.  
  412. void proces3(int fifo23[2])
  413. {
  414.     /* Działanie analogiczzne do procesów 1 i 2 */
  415.     zamknijFd(fifo23[FD_DO_ZAPISU]);
  416.     printf("Proces 3 wystartowal %d\n", getpid());
  417.     fflush(stdout);
  418.     /* +1 na nową linie */
  419.     char buforOdczytu[ROZPIAR_BUFORA + 1];
  420.     int ileOdczytano;
  421.     opusc(semid, S_USTALONO_SHM);
  422.  
  423.     signal(S1, s123Obsluga);
  424.     signal(S2, s123Obsluga);
  425.     signal(S3, s123Obsluga);
  426.     signal(S4, s4Oblusga);
  427.  
  428.     while(1)
  429.     {    
  430.         /* Odczytuje zaszyfrowane dane od procesu 2 przez pipe*/
  431.         odczytajStandardowaWiadomosc(fifo23[FD_DO_ODCZYTU], buforOdczytu, &ileOdczytano, ROZPIAR_BUFORA);
  432.         buforOdczytu[ileOdczytano] = '\n';
  433.         ileOdczytano++;
  434.         /* I wypisuję na standardowe wyjście (jego deksrptor to 1) procedura analogiczna co przy oddczycie w procesie 1*/
  435. ponowZapis:
  436.         if( write(1, buforOdczytu, ileOdczytano)== -1) {
  437.             if(errno == EINTR) {
  438.                
  439.                 goto ponowZapis;
  440.             } else {
  441.                 perror("write");
  442.                 exit(1);
  443.             }
  444.         }
  445.     }
  446.  
  447.     exit(0);
  448. }
  449.  
  450. size_t zaszyfrujCesar(char* wiadomosc, char klucz, size_t rozmiar)
  451. {
  452.     int i;
  453.     char ch;
  454.     for(i = 0; i<rozmiar; i++)
  455.     {
  456.         ch = wiadomosc[i];
  457.        
  458.         if(ch >= 'a' && ch <= 'z'){
  459.             ch = ch + klucz;
  460.            
  461.             if(ch > 'z'){
  462.                 ch = ch - 'z' + 'a' - 1;
  463.             }
  464.            
  465.             wiadomosc[i] = ch;
  466.         }
  467.         else if(ch >= 'A' && ch <= 'Z'){
  468.             ch = ch + klucz;
  469.            
  470.             if(ch > 'Z'){
  471.                 ch = ch - 'Z' + 'A' - 1;
  472.             }
  473.            
  474.             wiadomosc[i] = ch;
  475.         } else {
  476.             ch = '_';
  477.         }
  478.         wiadomosc[i] = ch;
  479.     }
  480.     return rozmiar;
  481. }
  482.  
  483.  
  484. void zapiszStandardowaWiadomosc(int fd, char* wejscie, int rozmiar)
  485. {
  486.     /*Zapisujemy do pipe wielkość wiadomości oraz jej treść powtarzając jeśli któryś z tych
  487.     kroków zostanie przerwany przez sygnał */
  488. ponowZapis:
  489.     if(write(fd, (char*)(&rozmiar), sizeof(int)) == -1) {
  490.         if(errno == EINTR) {
  491.            
  492.             goto ponowZapis;
  493.         } else {
  494.             perror("write");
  495.             exit(1);
  496.         }
  497.     }
  498.    
  499. ponowZapis2:
  500.     if(    write(fd, wejscie, rozmiar) == -1) {
  501.         if(errno == EINTR) {
  502.            
  503.             goto ponowZapis2;
  504.         } else {
  505.             perror("write");
  506.             exit(1);
  507.         }
  508.     }
  509.    
  510. }
  511.  
  512. void odczytajStandardowaWiadomosc(int fd, char* wyjscie, int* rozmiarWyjscia, int rozmiar)
  513. {
  514.     /* Jak wyżej tylko zapis*/
  515. ponowOdczyt:
  516.     if(read(fd, (char*)(rozmiarWyjscia), sizeof(int)) == -1) {
  517.         if(errno == EINTR) {
  518.             goto ponowOdczyt;
  519.         } else {
  520.             perror("write");
  521.             exit(1);
  522.         }
  523.     }
  524.  
  525. ponowOdczyt2:
  526.     if(read(fd, wyjscie, *rozmiarWyjscia) == -1) {
  527.         if(errno == EINTR) {
  528.             goto ponowOdczyt2;
  529.         } else {
  530.             perror("write");
  531.             exit(1);
  532.         }
  533.     }
  534. }
  535.  
  536.  
  537. void s123Obsluga(int signum) {
  538.     /* Jeśli odczytany sygnał jest taki sam jak ostatni odczytany sygnał nie przekazuję
  539.     informacji o nim innym procesom gdyz nie jest to konieczne w przeciwnym wypadku
  540.     zapisuję numer tego syganłu do pamięci dzielonej synchronizujac tą operację odpowiednimy
  541.     semaformai i wysyłam sygnał 4 aby poinformować pozostałe procesy o zapsianiu w pamięci dzielonej
  542.     nowego rządania od operatora */
  543.     if(stanProcesu == signum) {
  544.         // Potencjalnie miejsce do debugowania
  545.     } else {
  546.         opuscN(semid, S_ZAPISZ_KOMUNIKAT, 2);
  547.         *komunikat = signum;
  548.         if(getpid() == pidy[0]) {
  549.             podnies(semid, S_P2_ODCZYTAJ_KOMUNIKAT);
  550.             podnies(semid, S_P3_ODCZYTAJ_KOMUNIKAT);
  551.             kill(pidy[1], S4);
  552.             kill(pidy[2], S4);
  553.         } else if(getpid() == pidy[1]) {
  554.             podnies(semid, S_P1_ODCZYTAJ_KOMUNIKAT);
  555.             podnies(semid, S_P3_ODCZYTAJ_KOMUNIKAT);
  556.             kill(pidy[0], S4);
  557.             kill(pidy[2], S4);
  558.         } else {
  559.             podnies(semid, S_P1_ODCZYTAJ_KOMUNIKAT);
  560.             podnies(semid, S_P2_ODCZYTAJ_KOMUNIKAT);
  561.             kill(pidy[0], S4);
  562.             kill(pidy[1], S4);
  563.         }
  564.     }
  565.     stanProcesu = signum;
  566.     /*Reaguję odpowiednio na odpowiednie sygnały. Na sygnał do kontynuowania nie muszę,
  567.     ponieważ jest on częścią maski użytej w funkcji sigsuspend wiec otrzymanie go obudzi
  568.     proces */
  569.     if(signum == K_ZATRZYMAJ) {
  570.         sigsuspend (&mask);
  571.     }
  572.  
  573.     if(signum == K_ZAKONCZ) {
  574.         exit(0);
  575.     }
  576.  
  577.     if(signum == K_KONTYNUUJ) {
  578.         /*Miejsce do debugpwania*/
  579.     }
  580. }
  581.  
  582. void s4Oblusga(int signum) {
  583.     /* Działanie analogiczne do poprzedniej procedury obsługi tylko wartość sygnału, na który
  584.     trzeba zaregować odczytuje z pamięci dzielonej używając odpowiednich semaforów do synchronizacji
  585.     tej operacji oraz nie rozsyłamy dalej tego sygnału */
  586.     int mojPid = getpid();
  587.     int kopiaKomuniaktu = 0;
  588.     if(mojPid == pidy[0]) {
  589.         opusc(semid, S_P1_ODCZYTAJ_KOMUNIKAT);
  590.     } else if(mojPid == pidy[1]) {
  591.         opusc(semid, S_P2_ODCZYTAJ_KOMUNIKAT);
  592.     } else {
  593.         opusc(semid, S_P3_ODCZYTAJ_KOMUNIKAT);
  594.     }
  595.     kopiaKomuniaktu = *komunikat;
  596.     podnies(semid, S_ZAPISZ_KOMUNIKAT);
  597.     stanProcesu = kopiaKomuniaktu;
  598.     if(stanProcesu == K_ZATRZYMAJ) {
  599.         sigsuspend (&mask);
  600.     }
  601.  
  602.     if(stanProcesu == K_ZAKONCZ) {
  603.         exit(0);
  604.     }
  605.  
  606.     if(stanProcesu == K_KONTYNUUJ) {
  607.        
  608.     }
  609. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement