Redirecting files to C files

0

Hello, I have a question to implement piping in this code. I'm trying to implement the commands:

  • cat / etc / passwd > my_file_1
  • grep home < my_file_1 > my_file_2
  • wc -l < my_file_2

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h> //biblioteca para chamadas de sistema
    #include <sys/wait.h>
    //
    //  comando:
    //       $       cat /etc/passwd | grep home | wc
    //
    //   PROBLEMA:  como criar redirecionamento de/para arquivos:    cat /etc/passwd >  meu_arquivo_1
    //                                                               grep home < meu_arquivo_1 > meu_arquivo_2
    //                                                               wc < meu_arquivo_2
    //
    
    int main(int argc, char const *argv[]) {
    
      int pfd_1[2]; // descritor 1
      int pfd_2[2]; //descritor 2
      int status;   // estado do processo filho criado
    
      pipe( pfd_1 ); // criou pipe 1
      pipe( pfd_2 ); // criou pipe 2
    
      #ifdef DEBUG
        printf( "PAI: pfd_1[%d:%d]\t-\tpfd_2[%d:%d]\n\n", pfd_1[0],pfd_1[1],pfd_2[0],pfd_2[1] );
      #endif
    
      switch( fork() ){
        case -1: // se nao conseguir criar o processo filho ...
                  printf("O processo filho não foi criado!\n");
                  exit(1);
                  break;
        case 0: //se conseguir ...
                #ifdef DEBUG
                    printf( "FILHO 1: pfd_1[%d:%d]\t-\tpfd_2[%d:%d]\n\n", pfd_1[0],pfd_1[1],pfd_2[0],pfd_2[1]);
                #endif
                 close( 0 ); // o filho só poderá escrever fd(1)
                 dup2( pfd_1[ 0 ], 0 ); //duplicando descritor, jogando fora o descritor antigo
                 close( pfd_1[ 0 ] );
                 close( pfd_1[ 1 ] );
                 close( pfd_2[ 0 ] );
                 close( pfd_2[ 1 ] );
    
                        //a "/usr/sbin", que é reservada a executáveis que podem
                        //ser usados apenas pelo root (similar à pasta "/sbin")
                 execl( "/usr/bin/wc", "-l ", "zip", 0, NULL );  // como colocar parametro para contar linhas apenas? wc -l
                 break;
      }
    
      switch( fork() ){
        case -1:
                  printf("O processo filho não foi criado!\n");
                  exit(1);
                  break;
        case 0:
                #ifdef DEBUG
                  printf( "FILHO 2: pfd_1[%d:%d]\t-\tpfd_2[%d:%d]\n\n", pfd_1[0],pfd_1[1],pfd_2[0],pfd_2[1] );
                #endif
    
                 close( 0 );
                 dup2( pfd_2[ 0 ], 0 );
                 close( 1 );
                 dup2( pfd_2[ 1 ], 1 );
                 close( pfd_1[ 0 ] );
                 close( pfd_1[ 1 ] );
                 close( pfd_2[ 0 ] );
                 close( pfd_2[ 1 ] );
                 execl( "/bin/grep", "grep", "home", 0, NULL );
                 break;
      }
    
    
      switch( fork() ) {
        case -1: exit(1);
                 break;
        case 0:
      #ifdef DEBUG
         printf( "FILHO 3: pfd_1[%d:%d]\t-\tpfd_2[%d:%d]\n\n", pfd_1[0],pfd_1[1],pfd_2[0],pfd_2[1] );
      #endif
                 close( 1 );
                 dup2( pfd_2[ 1 ], 1 );
                 close( pfd_1[ 0 ] );
                 close( pfd_1[ 1 ] );
                 close( pfd_2[ 0 ] );
                 close( pfd_2[ 1 ] );
                 execl( "/bin/cat", "cat", "/etc/passwd", 0, NULL);
                 break;
      }
      wait(&status);
    
      return 0;
    }
    

I would also like to better understand the operation of the execl () function

    
asked by anonymous 30.03.2018 / 22:23

0 answers