GNU/Linux >> Tutoriales Linux >  >> Linux

Ejecutar programa desde dentro de un programa C

Quieres usar popen . Le brinda una tubería unidireccional con la que puede acceder a stdin y stdout del programa.

popen es estándar en los sistemas operativos Unix y similares a Unix modernos, de los cuales Linux es uno :-)

Tipo

man popen

en una terminal para leer más al respecto.

EDITAR

Si popen produce tuberías unidireccionales o bidireccionales según la implementación. En Linux y OpenBSD, popen produce conductos unidireccionales, que son de solo lectura o solo escritura. En OS X, FreeBSD y NetBSD popen produce tuberías bidireccionales.


Escribí un ejemplo de código C para otra persona hace un tiempo que muestra cómo hacer esto. Aquí está para ti:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

void error(char *s);
char *data = "Some input data\n";

main()
{
  int in[2], out[2], n, pid;
  char buf[255];

  /* In a pipe, xx[0] is for reading, xx[1] is for writing */
  if (pipe(in) < 0) error("pipe in");
  if (pipe(out) < 0) error("pipe out");

  if ((pid=fork()) == 0) {
    /* This is the child process */

    /* Close stdin, stdout, stderr */
    close(0);
    close(1);
    close(2);
    /* make our pipes, our new stdin,stdout and stderr */
    dup2(in[0],0);
    dup2(out[1],1);
    dup2(out[1],2);

    /* Close the other ends of the pipes that the parent will use, because if
     * we leave these open in the child, the child/parent will not get an EOF
     * when the parent/child closes their end of the pipe.
     */
    close(in[1]);
    close(out[0]);

    /* Over-write the child process with the hexdump binary */
    execl("/usr/bin/hexdump", "hexdump", "-C", (char *)NULL);
    error("Could not exec hexdump");
  }

  printf("Spawned 'hexdump -C' as a child process at pid %d\n", pid);

  /* This is the parent process */
  /* Close the pipe ends that the child uses to read from / write to so
   * the when we close the others, an EOF will be transmitted properly.
   */
  close(in[0]);
  close(out[1]);

  printf("<- %s", data);
  /* Write some data to the childs input */
  write(in[1], data, strlen(data));

  /* Because of the small amount of data, the child may block unless we
   * close it's input stream. This sends an EOF to the child on it's
   * stdin.
   */
  close(in[1]);

  /* Read back any output */
  n = read(out[0], buf, 250);
  buf[n] = 0;
  printf("-> %s",buf);
  exit(0);
}

void error(char *s)
{
  perror(s);
  exit(1);
}

  1. Crea dos tuberías con pipe(...) , uno para stdin , uno para stdout .
  2. fork(...) el proceso.
  3. En el proceso secundario (aquel en el que fork(...) devuelve 0) dup (...) las tuberías a stdin /stdout .
  4. exec[v][e] el archivo de programa que se iniciará en el proceso secundario.
  5. En el proceso principal (aquel en el que fork ) devuelve el PID del niño) hacer un bucle que lea desde el stdout del niño (select(...) o poll(...) , read(...) ) en un búfer, hasta que thechild termina (waitpid(...) ).
  6. Eventualmente proporcione al niño información sobre stdin si espera algo.
  7. Cuando termine close(...) las tuberías.

Linux
  1. ¿Enviar entrada a una sesión de pantalla desde el exterior?

  2. ¿Cómo hacer que un programa sea ejecutable desde cualquier lugar?

  3. ¿Evitar que Signint llegue a los procesos secundarios?

  4. ¿Cómo extraigo una sola porción de bytes de un archivo?

  5. Ejecutar comandos de Shell desde el programa que se ejecuta en WINE

Programe hardware desde la línea de comandos de Linux

Cómo instalar un programa desde la fuente en Linux

¿Cómo encontrar la ruta completa del programa C++ Linux desde adentro?

¿Cómo obtener resultados de gdb.execute en PythonGDB (GDB 7.1)?

¿Cómo ejecutar el script de Python desde Java?

Cancelar arrastrar y soltar desde un programa ocupado