2010-04-21 14 views
6

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]; 
    } 
} 

Respuesta

0

Cualquier razón por la que no puede canalizar la entrada de tr a su programa?

tr A-Z a-z | myprogram

+0

Sí, pero es un poco complicado entrar. Quiero manejar todo esto dentro del programa mismo. –

1

lectura desde stdin hace la vida más difícil. Si puede vivir leyendo desde otra FILE *, es bastante fácil usar popen() para generar tr, y leer desde FILE *.

Editar: si no puedes hacer eso, entonces necesitas entrar en un poco de fealdad. Comience usando popen para engendrar tr con su salida redirigida. Luego use fileno para obtener los números de archivo asociados con ese FILE * y con stdin. Finalmente, use dup2 para asociar el descriptor de archivo stdin con el conducto desde tr.

+1

Sí, es lo suficientemente difícil como para tener que hacer la pregunta. Si pudiera hacer eso, lo haría. :-) –

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); 
} 

y utilizar

tr A-Z a-z | myprogram

1

Ver popen(3). Básicamente todo lo que necesita hacer es

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

y luego se leen de in.

Cuestiones relacionadas