Advertisement
hascas

Untitled

May 25th, 2020
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.65 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <sys/wait.h>
  5. #include <string.h>
  6.  
  7. int main(void) {
  8.     int pid, p0_p1[2], p1_p2[2], p2_p0[2];
  9.     char ch;
  10.  
  11.     /* Creare canal anonim. */
  12.     if (-1 == pipe(p0_p1)) {
  13.         perror("Eroare la crearea canalului anonim");
  14.         exit(1);
  15.     }
  16.     if (-1 == pipe(p1_p2)) {
  17.         perror("Eroare la crearea canalului anonim");
  18.         exit(1);
  19.     }
  20.     if (-1 == pipe(p2_p0)) {
  21.         perror("Eroare la crearea canalului anonim");
  22.         exit(1);
  23.     }
  24.  
  25.     /* Creare proces fiu. */
  26.     if (-1 == (pid = fork())) {
  27.         perror("Eroare la crearea unui proces fiu");
  28.         exit(2);
  29.     }
  30.  
  31.     if (pid) { /* Secvența de cod executată doar de procesul tată. */
  32.         //printf("Am inceput executia procesului tata!\n");
  33.         /* Tatăl își închide capătul de citire din canal. */
  34.         close(p0_p1[0]);
  35.         while (1) {
  36.             ch = fgetc(stdin);
  37.             if (ch == EOF || ch == '\n')
  38.                 break;
  39.             //printf("Am scris caracterul : %c \n",ch);
  40.             write(p0_p1[1], &ch, 1);
  41.         }
  42.         /* Tatăl își închide capătul de scriere în canal */
  43.         close(p0_p1[1]);
  44.         /* Fiul  1 își închide capătul de scriere în canal */
  45.         wait(NULL);
  46.         close(p1_p2[1]);
  47.         /* Fiul 1 își închide capătul de citire din canal. */
  48.         close(p0_p1[0]);
  49.         /* Tatăl așteaptă terminarea fiului 1. */
  50.         if (-1 == (pid = fork())) {
  51.             perror("Eroare la crearea unui proces fiu");
  52.             exit(2);
  53.         }
  54.         if (pid) {
  55.             /* Tatăl așteaptă terminarea fiului 2. */
  56.             wait(NULL);
  57.             /* Tatăl își închide capătul de scriere din canal. */
  58.             close(p2_p0[1]);
  59.             while (read(p2_p0[0], &ch, 1) > 0)
  60.                 printf("%c", ch);
  61.             printf("\n");
  62.             /* Tatăl își închide capătul de citire din canal. */
  63.             close(p2_p0[0]);
  64.             //printf("Am terminat executia procesului tata!\n");
  65.         } else { /* Secvența de cod executată doar de al doilea fiu. */
  66.             //printf("Am inceput executia procesului fiu 2!\n");
  67.             /* Fiul își închide capătul de citire din canal. */
  68.             close(p2_p0[0]);
  69.             /* Fiul 2 își închide capătul de scriere în canal */
  70.             close(p1_p2[1]);
  71.             while (read(p1_p2[0], &ch, 1) > 0) {
  72.                 if (ch >= 'a' && ch <= 'z') {
  73.                     ch -= 'a';
  74.                     ch += 'A';
  75.                 }
  76.                 //printf("Am scris caracterul : %c \n",ch);
  77.                 write(p2_p0[1], &ch, 1);
  78.             }
  79.             //printf("Am citit caracterele din pipe in procesul fiu 2!\n");
  80.             /* Fiul își închide capătul de citire din canal. */
  81.             close(p1_p2[0]);
  82.             /* Fiull 2 își închide capătul de scriere în canalul p2_p0 */
  83.             close(p2_p0[1]);
  84.             //printf("Am terminat executia procesului fiu 2!\n");
  85.         }
  86.     } else { /* Secvența de cod executată doar de primul fiu. */
  87.         //printf("Am inceput executia primului proces fiu!\n");
  88.         /* Fiul 1 își închide capătul de citire din canal. */
  89.         close(p1_p2[0]);
  90.         /* Fiul 1 își închide capătul de scriere în canal */
  91.         close(p0_p1[1]);
  92.         while (read(p0_p1[0], &ch, 1) > 0)
  93.             if (strchr("aeiouAEIOU", ch) == NULL) {
  94.                 //printf("Am scris caracterul : %c \n",ch);
  95.                 write(p1_p2[1], &ch, 1);
  96.             }
  97.         //printf("Am terminat executia primului proces fiu!\n");
  98.     }
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement