J’ai un programme en C, et j’aimerais le faire filtrer toutes ses entrées avec tr. Donc, je voudrais commencer comme un processus enfant, redirect mon stdin vers lui, puis capturer la sortie standard et lire à partir de cela.
Edit: voici le code que j’ai jusqu’à présent, qui ne fonctionne pas. Il se sépare instantanément, mais je ne comprends pas pourquoi:
#include #include int main(int argc, char** argv){ int ch; int fd = ssortingpNewlines(); while((ch = getc(fd)) != EOF){ putc(ch, stdout); } return 0; } int ssortingpNewlines(){ int fd[2], ch; pipe(fd); if(!fork()){ close(fd[0]); while((ch = getc(stdin)) != EOF){ if(ch == '\n'){ continue; } putc(ch, fd[1]); } exit(0); }else{ close(fd[1]); return fd[0]; } }
Edit: Il s’avère que c’était deux choses: l’une était que mon en-tête ne définissait pas stdin et stdout comme 0 et 1, donc je lisais / écrivais en fait des tubes totalement aléatoires. L’autre est que pour une raison quelconque, getc et putc ne fonctionnent pas comme prévu, alors j’ai dû utiliser read () et write (). Si je le fais, c’est parfait:
#include #include int main(int argc, char** argv){ int ch; int fd = ssortingpNewlines(); while(read(fd, &ch, 1) == 1){ write(1, &ch, 1); } return 0; } int ssortingpNewlines(){ int fd[2]; int ch; pipe(fd); if(!fork()){ close(fd[0]); while(read(0, &ch, 1) == 1){ if(ch == '\n'){ continue; } write(fd[1], &ch, 1); } exit(0); }else{ close(fd[1]); return fd[0]; } }
La lecture de stdin
rend la vie plus difficile. Si vous pouvez vivre avec la lecture d’un autre FILE *
, il est assez facile d’utiliser popen()
pour générer et lire le FILE *
qu’il retourne.
Edit: si vous ne pouvez pas faire cela, alors vous devez entrer dans un peu de laideur. Commencez par utiliser popen
pour générer tr
avec sa sortie redirigée. Ensuite, utilisez fileno
pour obtenir les numéros de fichiers associés à ce FILE *
et à stdin
. Enfin, utilisez dup2
pour associer le descripteur de fichier de stdin
au tube de tr
.
Voir popen(3)
. En gros, tout ce que vous devez faire est
FILE *in = popen("tr ", "r");
et ensuite lire de l’intérieur
Une raison quelconque pour laquelle vous ne pouvez tout simplement pas transmettre les informations de votre programme à votre programme?
tr AZ az | myprogram
#include int main() { char x1[100]; scanf("%[^\n]",x1); // read entire line from tr ie, from stdin printf("\n%s",x1); }
et utilise
tr AZ az | monprogramme