Benchea_Paul_Catalin

ex1

May 14th, 2021
504
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <errno.h>
  6.  
  7. int main()
  8. {
  9.     pid_t pid1, pid2, pid3;
  10.     int pipe_Cmd1toCmd2[2], pipe_Cmd2toCmd3[2], pipe_Cmd3toCmd4[2];
  11.     printf("Incepe \n");
  12.     if(-1 == pipe(pipe_Cmd3toCmd4) )
  13.     {  fprintf(stderr, "Eroare: nu pot crea al treilea canal anonim, errno=%d\n",errno);  perror("Cauza erorii");  exit(1);  }
  14.  
  15.     if(-1 == (pid1=fork()) )
  16.     {  perror("Eroare: nu am putut crea primul fiu. Cauza erorii");  exit(2);  }
  17.  
  18.     if(pid1 == 0)
  19.     { // Secțiune de cod executată doar de către fiul procesului inițial.
  20.         printf("Ajunge la sf");
  21.         if(-1 == pipe(pipe_Cmd2toCmd3) )
  22.         {  fprintf(stderr, "Eroare: nu pot crea al doilea canal anonim, errno=%d\n",errno);  perror("Cauza erorii");  exit(3);  }
  23.    
  24.         if(-1 == (pid2=fork()) )
  25.         {  perror("Eroare: nu am putut crea al doilea proces fiu. Cauza erorii");  exit(4);  }
  26.  
  27.         if(pid2 == 0)
  28.         { // Secțiune de cod executată doar de către "nepotul" procesului inițial.
  29.  
  30.             //---------------------------------------------------------------
  31.             if(-1 == pipe(pipe_Cmd1toCmd2) )
  32.             {  fprintf(stderr, "Eroare: nu pot crea primul canal anonim, errno=%d\n",errno);  perror("Cauza erorii");  exit(5);  }
  33.        
  34.             if(-1 == (pid3=fork()) )
  35.             {  perror("Eroare: nu am putut crea al treilea proces fiu. Cauza erorii");  exit(6);  }
  36.  
  37.             if(pid3 == 0)
  38.             { // Secțiune de cod executată doar de către al 3-lea fiu al procesului inițial.
  39.  
  40.                 if(-1 == dup2(pipe_Cmd1toCmd2[1],1) )
  41.                 {  perror("Eroare: redirectarea iesirii standard in al treilea fiu a esuat. Cauza erorii");  exit(7);  }
  42.        
  43.                 execlp("grep","sudo:","/etc/group",NULL);
  44.                 perror("Eroare la execlp() in ultimul fiu. Cauza erorii");  exit(8);
  45.             }
  46.             else
  47.             { // Secțiune de cod executată de catre al doilea fiu al procesului inițial.
  48.                 close(pipe_Cmd1toCmd2[1]);
  49.  
  50.                 if(-1 == dup2(pipe_Cmd1toCmd2[0],0) )
  51.                 {  perror("Eroare: redirectarea intrarii standard in primul fiu a esuat. Cauza erorii"); exit(9);  }
  52.  
  53.                 if(-1 == dup2(pipe_Cmd2toCmd3[1],1) )
  54.                 {  perror("Eroare: redirectarea iesirii standard in primul fiu a esuat. Cauza erorii");  exit(10);  }
  55.            
  56.                 execlp("cut","cut","-f4","-d:",NULL);
  57.                 perror("Eroare la execlp() in al doilea proces fiu. Cauza erorii");  exit(11);
  58.             }              
  59.         }
  60.         else
  61.         { // Secțiune de cod executată doar de către fiul procesului inițial.
  62.             close(pipe_Cmd2toCmd3[1]);  
  63.             if(-1 == dup2(pipe_Cmd2toCmd3[0],0) )
  64.             {  perror("Eroare: redirectarea intrarii standard in primul fiu a esuat. Cauza erorii"); exit(12);  }
  65.  
  66.             if(-1 == dup2(pipe_Cmd3toCmd4[1],1) )
  67.             {  perror("Eroare: redirectarea iesirii standard in primul fiu a esuat. Cauza erorii");  exit(13);  }
  68.    
  69.             execlp("tr","tr",",", "\n",NULL);
  70.             perror("Eroare la execlp() in primul fiu. Cauza erorii");  exit(14);
  71.         }
  72.     }
  73.     else
  74.     { // Secțiune de cod executată doar de către părinte (i.e., procesul inițial).
  75.         close(pipe_Cmd3toCmd4[1]);
  76.  
  77.         if(-1 == dup2(pipe_Cmd3toCmd4[0],0) )
  78.         {  perror("Eroare: redirectarea intrarii standard in parinte a esuat. Cauza erorii");  exit(10);  }
  79.  
  80.         execlp("wc","wc","-l",NULL);
  81.         perror("Eroare la execlp() in parinte. Cauza erorii");  exit(11);
  82.     }
  83.     printf("Ajunge la sf\n");
  84.     return 0;  
  85. }
RAW Paste Data