2017-05-06 3 views
0

Je suis en train de faire un programme qui recevra 3 arguments, ./a.out abc, où a et c sont des nombres de colonnes et b et opérande à partir de lignes séparées par:.Lit le tube stdin (et store value) à l'enfant, fait une coupe, et retourne la valeur

Lorsque son vrai reproduit le stdin d'autre pas de résultats.

exemples:

$ ./a.out 1 > 2 
$ 5:2:1:6 
5:2:1:6 

$ ./a.out 2 = 4 
$ 1:2:3:4 
$ 

j'ai essayé dans ma première version, doint la conduite et la lecture de la stdin lorsque la coupe demande, mais mon problème est que je perds l'entrée.

Maintenant j'essaye de lire du stdin dans l'enfant, le stocke et le passe par un tuyau, mais pour mes essais je devine que l'execlp n'obtient pas l'entrée de stdin.

Je ne peux pas utiliser awk, c'est pour un travail académique.

mon code à ce moment:

int main(int argc, char const *argv[]){ 

    int n,f; 
    char coluna1[16]; 
    char coluna2[16]; 
    char strin[PIPE_BUF]; 
    //put together args cut 
    char buffer[PIPE_BUF]; 
    sprintf(buffer, "-f%s,%s",argv[1],argv[3]); 

    //pipes 
    int fd[2]; 
    int fd2[2]; 
    pipe(fd); 
    pipe(fd2); 

    if(!fork()) { 
     close(fd[0]); //close read 
     dup2(fd[1],1); //std output duplicated to pipe write 
     close(fd2[0]); //close read 
     //readline stdin 
     n = read(0,strin,PIPE_BUF); 
     write(fd2[1],strin,n); 
     //cut -d: -f2,4 - 
     execlp("cut","cut","-d:",buffer,"-",NULL); 
    } 
    //pai recebe do pipe 
    close(fd[1]); //close write 
    close(fd2[1]); //close write 
    n = read(fd2[0],strin,PIPE_BUF); //read stdin from pipe 
    f = read(fd[0],buffer,PIPE_BUF); //stdout from cut 
    sscanf(buffer,"%[^:]:%s",coluna1,coluna2); 

    //write the result from the cut to "bug check" 
    write(1,buffer,f); 

    //printfs just to check if everything worked 
    if(strcmp(argv[2],"=")) if(atoi(coluna1) == atoi(coluna2)) { write(1,strin,n); printf("ACERTEI NO =\n"); } 
    if(strcmp(argv[2],">=")) if(atoi(coluna1) >= atoi(coluna2)) { write(1,strin,n); printf("ACERTEI NO >=\n"); } 
    if(strcmp(argv[2],"<=")) if(atoi(coluna1) <= atoi(coluna2)) { write(1,strin,n); printf("ACERTEI NO <=\n"); } 
    if(strcmp(argv[2],">")) if(atoi(coluna1) > atoi(coluna2)) { write(1,strin,n); printf("ACERTEI NO >\n"); } 
    if(strcmp(argv[2],"<")) if(atoi(coluna1) < atoi(coluna2)) { write(1,strin,n); printf("ACERTEI NO <\n"); } 
    if(strcmp(argv[2],"!=")) if(atoi(coluna1) != atoi(coluna2)) { write(1,strin,n); printf("ACERTEI NO !=\n"); } 

} 
+0

Une question que je vois est que dans beaucoup de coquilles le « > » et des « = » ont spécial sens. C'est aussi un peu moche d'utiliser des littéraux pour les fds. Je préfère les macros pour clarifier cela. –

+0

Quand j'essaie sur le shell, j'utilise ">" pour éviter les problèmes de redéection. Les macros signifient comme STDIN et tel? –

+0

Les macros dont je parle sont STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO. Et oui, en citant ou en échappant au signe devrait résoudre ce genre de problème. –

Répondre

0

fixe comme ceci:

if(!fork()) { 
    close(fd[0]); //close read 
    dup2(fd[1],1); //std output duplicated to pipe write 
    close(fd2[1]); //close write 
    dup2(fd2[0],0); //std input from father duplicated to pipe read 
    //cut -d: -f2,4 - 
    execlp("cut","cut","-d:",buffer,"-",NULL); 
} 
//father 
close(fd[1]); //close write 
close(fd2[0]); //close read 
n = read(0,strin,PIPE_BUF); 
write(fd2[1],strin,n); 
close(fd2[1]); 
//n = read(fd2[0],strin,PIPE_BUF); //read stdin from pipe 
f = read(fd[0],buffer,PIPE_BUF); //stdout from cut