У меня есть программа C, и я хотел бы иметь ее, фильтруют весь ее вход с TR Так, я хотел бы запустить TR как дочерний процесс, перенаправить мой stdin к ней, затем получил бы stdout TR и читал бы из этого.
Править: вот код, который я имею до сих пор, который не работает. Это segfaults немедленно, но я не понимаю почему:
#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];
}
}
Править: Оказывается, что это было двумя вещами: каждый был тем моим заголовком, не определил stdin и stdout как 0 и 1, таким образом, я на самом деле читал/писал в полностью случайные каналы. Другой то, что по некоторым причинам getc и putc не работают, как я ожидал бы, таким образом, я должен был использовать чтение () и запись () вместо этого. Если я делаю это, это прекрасно:
#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];
}
}
Чтение его из stdin
усложняет жизнь. Если вы можете жить с чтением из другого ФАЙЛА *
, довольно просто использовать popen ()
для создания tr
и чтения из ФАЙЛА *
он возвращается.
Изменить: если вы не можете этого сделать, тогда вам нужно немного уродиться. Начните с использования popen
для порождения tr
с перенаправлением его вывода. Затем используйте fileno
, чтобы получить номера файлов, связанных с этим FILE *
и с stdin
. Наконец, используйте dup2
, чтобы связать файловый дескриптор stdin
с конвейером из tr
.
См. popen (3)
. В основном все, что вам нужно сделать, это
FILE *in = popen("tr <args>", "r");
, а затем прочитать из в
.
Есть ли причина, по которой вы просто не можете передать входные данные tr в свою программу?
tr A-Z a-z | myprogram
#include <stdio.h>
int main()
{
char x1[100];
scanf("%[^\n]",x1); // read entire line from tr i.e., from stdin
printf("\n%s",x1);
}
и используйте
tr A-Z a-z | myprogram