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