У меня есть программа на C, и я бы хотел, чтобы она отфильтровывала все свои данные с помощью tr. Итак, я хотел бы запустить tr как дочерний процесс, перенаправить мой stdin на него, а затем записать trdout tr и прочитать из этого.Перенаправить stdin в программу C другому процессу
Редактировать: вот код, который у меня есть до сих пор, который не работает. Он мгновенно возвращает ошибку сегментации, но я не понимаю, почему:
#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: Оказывается, это было две вещи: один, что мой заголовок не определяет стандартный ввод и стандартный вывод, как 0 и 1, так что я на самом деле чтение/запись в полностью случайные трубы. Другое дело, что по какой-то причине getc и putc работают не так, как я ожидал, поэтому мне пришлось использовать read() и write(). Если я это сделаю, это прекрасно:
#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];
}
}
Да, но это сложно. Я хочу обрабатывать все это внутри самой программы. –