J'ai un programme C, et j'aimerais qu'il filtre toutes ses entrées avec tr. Donc, j'aimerais commencer tr comme un processus enfant, rediriger mon stdin, puis capturer tr stdout et lire à partir de cela. Edit: voici le code que j'ai jusqu'à présent, qui ne fonctionne pas. Il segfaults instantanément, mais je ne comprends pas pourquoi:Rediriger stdin dans le programme C vers un autre processus
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv){
int ch;
int fd = stripNewlines();
while((ch = getc(fd)) != EOF){
putc(ch, stdout);
}
return 0;
}
int stripNewlines(){
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: Active c'était deux choses: l'une est que ma tête n'a pas défini stdin et stdout comme 0 et 1, alors que je fait la lecture/écrire à des tuyaux totalement aléatoires. L'autre est que pour une raison quelconque, getc et putc ne fonctionnent pas comme je l'attendais, donc j'ai dû utiliser read() et write() à la place. Si je fais cela, c'est parfait:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv){
int ch;
int fd = stripNewlines();
while(read(fd, &ch, 1) == 1){
write(1, &ch, 1);
}
return 0;
}
int stripNewlines(){
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];
}
}
Oui, mais c'est un peu compliqué. Je veux gérer tout cela dans le programme lui-même. –