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"); }
}
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. –
Quand j'essaie sur le shell, j'utilise ">" pour éviter les problèmes de redéection. Les macros signifient comme STDIN et tel? –
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. –