Advertisement
Guest User

Untitled

a guest
May 25th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.68 KB | None | 0 0
  1. /*******************************************************************************************************
  2. Scop: testarea abilitatii de a scrie un program in limbajul C, folosind API-ul POSIX, ce rezolva o problema data.
  3. Enunt a treia problema:
  4.  
  5. Sa se scrie un program C care va crea doua procese fii si va implementa urmatoarea functionalitate:
  6. Procesul tata va citi de la tastatura o propozitie, pe care o va transmite primului fiu.
  7. Primul fiu va elimina toate vocalele si va transmite textul obtinut astfel catre fiul al doilea.
  8. Al doilea fiu va procesa textul primit transformand toate literele mici in litere mari, iar rezultatul
  9. il va trimite catre tata.
  10. Tatal va afisa pe ecran textul prelucrat primit de la al doiela fiu.
  11.  
  12. Pentru comunicarea intre procese veti folosi canale anonime (pipe-uri).
  13.  
  14. NOTA: pastrati enuntul in acest comentariu si scrieti rezolvarea mai jos.
  15. *******************************************************************************************************/
  16.  
  17. #include <unistd.h>
  18. #include <stdio.h>
  19. #include <sys/types.h>
  20. #include <sys/wait.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <time.h>
  24. #include <string.h>
  25.  
  26. //T : text
  27. //F1: text fara voc
  28. //F2: text litere mari
  29. //T : afis(text)
  30.  
  31. int main(){
  32.     pid_t pid1, pid2;
  33.  
  34.     int pipe0To1[2];
  35.     int pipe1To2[2];
  36.     int pipe2To0[2];
  37.  
  38.     //Verificam creerea corecta a pipe-urile
  39.     if (pipe(pipe0To1) == -1){
  40.         exit(1);
  41.     }
  42.  
  43.     if (pipe(pipe1To2) == -1){
  44.         exit(1);
  45.     }
  46.  
  47.     if (pipe(pipe2To0) == -1){
  48.         exit(1);
  49.     }
  50.  
  51.     //Verificam creerea primului copil
  52.     if ((pid1 = fork()) == -1){
  53.         exit(2);
  54.     }
  55.  
  56.     if (pid1 == 0){
  57.         //Child1
  58.  
  59.         //Inchidem pipe-urile ne-necesare
  60.         close(pipe0To1[1]);
  61.         close(pipe1To2[0]);
  62.         close(pipe2To0[0]);
  63.         close(pipe2To0[1]);
  64.  
  65.         char c;
  66.         while(read(pipe0To1[0], &c, 1)){
  67.             //Verificam daca e vocala
  68.             if (!strchr("aeiouAEIOU", c)){
  69.  
  70.                 //Trimitem la fiu2
  71.                 write(pipe1To2[1], &c, 1);
  72.             }
  73.         }
  74.         close(pipe0To1[0]);
  75.         close(pipe1To2[1]);
  76.     }
  77.     else{
  78.         if ((pid2 = fork()) == -1){
  79.             exit(2);
  80.         }
  81.  
  82.         if (pid2 == 0){
  83.             //Child2;
  84.  
  85.             //Inchidem pipe-urile ne-necesare
  86.             close(pipe1To2[1]);
  87.             close(pipe2To0[0]);
  88.             close(pipe0To1[0]);
  89.             close(pipe0To1[1]);
  90.  
  91.             char c;
  92.             while(read(pipe1To2[0], &c, 1)){
  93.  
  94.                 //Verificam daca e litera mica
  95.                 if (c >= 'a' && c <= 'z'){
  96.  
  97.                     //Tranformam in litera mare
  98.                     c -= 'a' - 'A';
  99.                 }
  100.  
  101.                 //Trimitem la tata
  102.                 write(pipe2To0[1], &c, 1);
  103.             }
  104.  
  105.             //Inchidem pipe-urile folosite
  106.             close(pipe1To2[0]);
  107.             close(pipe2To0[1]);
  108.         }
  109.         else{
  110.             //Father;
  111.  
  112.             //Inchidem pipe-urile ne-necesare
  113.             close(pipe0To1[0]);
  114.             close(pipe2To0[1]);
  115.             close(pipe1To2[0]);
  116.             close(pipe1To2[1]);
  117.  
  118.             char c;
  119.             while((c = getchar()) != EOF){
  120.  
  121.                 //Trimitem la fiu1
  122.                 write(pipe0To1[1], &c, 1);
  123.             }
  124.  
  125.             //Inchidem pipe-urile folosite
  126.             close(pipe0To1[1]);
  127.  
  128.             //Ne asiguram ca fii si-au terminat treaba
  129.             wait(NULL);
  130.  
  131.             //Afisam textul
  132.             while(read(pipe2To0[0], &c, 1)){
  133.                 printf("%c", c);
  134.             }
  135.  
  136.             //Inchidem pipe-urile folosite
  137.             close(pipe2To0[0]);
  138.         }
  139.     }
  140.  
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement