Tengo un programa C, y me gustaría que filtre toda su entrada con tr. Por lo tanto, me gustaría iniciar tr como un proceso secundario, redirigir mi stdin a él, luego capturar stdout de tr y leer de eso.Redirigir stdin en el programa C a otro proceso
Editar: aquí está el código que tengo hasta ahora, que no funciona. Se segfaults al instante, pero no entiendo por qué:
#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];
}
}
Editar: Resulta que este era dos cosas: uno era que mi cabecera no definió entrada y salida estándar como 0 y 1, por lo que en realidad estaba leyendo/escribiendo en tubos totalmente aleatorios. La otra es que, por alguna razón, getc y putc no funcionan como yo esperaba, así que tuve que usar read() y write() en su lugar. Si hago eso, es perfecto:
#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];
}
}
Sí, pero es un poco complicado entrar. Quiero manejar todo esto dentro del programa mismo. –