2010-04-21 2 views
6

У меня есть программа на 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]; 
    } 
} 

ответ

0

Любая причина, по которой вы просто не можете передать входные данные tr из вашей программы?

tr A-Z a-z | myprogram

+0

Да, но это сложно. Я хочу обрабатывать все это внутри самой программы. –

1

Чтение его из stdin делает жизнь более трудной. Если вы можете жить с чтением из другого , довольно легко использовать popen(), чтобы открыть tr, и читать с FILE * он возвращается.

Редактировать: если вы не можете этого сделать, вам нужно немного уродство. Начните с использования popen, чтобы вызвать tr с перенаправленным выходом. Затем используйте fileno, чтобы получить номера файлов, связанные с этим FILE *, и с stdin. Наконец, используйте dup2 для связывания файлового дескриптора stdin с трубой от tr.

+1

Да, это затрудняет достаточно, чтобы я задал вопрос. Если бы я мог это сделать, я бы это сделал. :-) –

0
#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-Z | myprogram

1

См. popen(3). В основном все, что вам нужно сделать, это

FILE *in = popen("tr <args>", "r"); 

а затем прочитайте от in.

Смежные вопросы