Redirection du programme stdin in C vers un autre processus

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