es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Envía un búfer desde mi programa hacia la entrada estándar de otro programa utilizando popen.

Supongamos que tengo un programa que, en parte, ejecuta otro programa
usando   FILE *outptr=popen(“alguna cadena de comando”,”r”)   y luego
lee con fread() la salida estándar de ese programa desde outptr. Ahora, si ese otro programa
lee su entrada desde su entrada estándar, y quiero
que esa entrada provenga de un archivo inputfile que ya está en el disco, entonces fácilmente podría
escribir   FILE *outptr=popen(“cat inputfile|otherpgm”,”r”);

Pero aquí está el problema: en lugar de un archivo inputfile en el disco, mi
programa tiene un buffer interno   unsigned char buffer[9999]   que es
lo que quiero dirigir al stream de entrada de otherpgm, pero que no quiero escribir
en el disco primero. ¿Cómo puedo hacer que el buffer[] se dirija directamente al stdin de otherpgm
usando popen()? O algún otro mecanismo, siempre y cuando pueda leer
la salida estándar de otherpgm desde mi programa.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución sería usar popen() para abrir una tubería a otherpgm y luego usar fwrite() para escribir el contenido de buffer[] en esa tubería. Aquí hay un ejemplo de código:

    char cmd[100];
    sprintf(cmd, "otherpgm");
    FILE *outptr = popen(cmd, "w");
    fwrite(buffer, sizeof(char), sizeof(buffer), outptr);
    pclose(outptr);
    

    En este ejemplo, usamos sprintf() para crear una cadena de comandos para ejecutar otherpgm usando popen(). Luego, abrimos la tubería en modo escritura para poder escribir el contenido de buffer[] en stdin de otherpgm. Finalmente, cerramos la tubería usando pclose().

    Es importante destacar que este código asume que otherpgm lee su entrada desde stdin (como lo indica la pregunta original). Si otherpgm lee su entrada desde un descriptor de archivo diferente (por ejemplo, fd 3), sería necesario utilizar un enfoque diferente (por ejemplo, usar dup2() para redirigir stdin a fd 3).

Comments are closed.