¿Cómo se escribe un programa en C para ejecutar otro programa?

4 minutos de lectura

avatar de usuario
wa-ja

En Linux, me gustaría escribir un programa en C que inicie otro programa. Cuando se ejecuta el programa, el shell estará esperando que ingrese un comando que haya definido en su programa. Este comando iniciará el segundo programa.

Por ejemplo, suponga que hay un programa C simple llamado “hola” en el mismo directorio que el programa que lo invoca. El programa “hola” imprime la salida “hola, mundo”. El primer programa se ejecutaría y el usuario ingresaría el comando “hola”. Se ejecutaría el programa “hola” y “hola, mundo”. se enviaría al shell.

Hice algunas búsquedas y la gente sugirió las funciones “fork()” y “exec()”. Otros dijeron que usaran “system()”. No tengo conocimiento sobre estas funciones. ¿Cómo llamo a estas funciones? ¿Son apropiados para su uso?

El código de ejemplo con explicaciones sería de gran ayuda. Otras respuestas también son bienvenidas. Tu ayuda es muy apreciada.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* for fork */
#include <sys/types.h> /* for pid_t */
#include <sys/wait.h> /* for wait */

int main()
{
    /*Spawn a child to run the program.*/
    pid_t pid=fork();
    if (pid==0) { /* child process */
        static char *argv[]={"echo","Foo is my name.",NULL};
        execv("/bin/echo",argv);
        exit(127); /* only if execv fails */
    }
    else { /* pid!=0; parent process */
        waitpid(pid,0,0); /* wait for child to exit */
    }
    return 0;
}

  • Por que es echo en el argv variable y en el execv ¿llamada?

    – Usuario

    5 oct 2016 a las 19:43

  • @Usuario, porque es argv[0]es decir nombre del programa.

    – 0andriy

    9 de enero de 2017 a las 23:57

avatar de usuario
Terminal

Si es nuevo en la bifurcación, la representación gráfica sobre la bifurcación y el exec podría serle útil.

representación de fork()

  +-------------+  
  |main program |  
  +-------------+    (fork())
        |___________________________  
  +-------------+                   |
  |main program |           +-------------+ 
  +-------------+           |main program |
        |                   +-------------+  
  +-------------+                   |        (exec())
  |main program |           +-------------+
  +-------------+           |hello program|
                            +-------------+  

Como ya habrás leído en un tutorial, después de llamar fork() se crea una copia duplicada del programa existente, y el exec() después de eso, reemplaza esa copia con el nuevo programa, que le pasa como argumentos. Dos unidades de ejecución para dos programas se ejecutarán después fork().

no lo haré system() ser suficiente para ti?

/* ... */
if (!strcmp(cmd, "hello")) system("hello.exe");
/* ... */

  • es Linux, por lo que es probable que no se encuentre ningún exe. Sin embargo, puede ser cualquier nombre.

    – Vladímir Ivánov

    28 de marzo de 2011 a las 14:30

  • @Vladimir: el OP dice que el programa es “hello.c”. Lo más probable es que no lo sea. Solo quería indicarle la dirección correcta cuando pruebe mi fragmento 🙂

    – pmg

    28 de marzo de 2011 a las 14:33

  • @vissi: <cstdlib> es probablemente la versión C++; la versión C se declara en <stdlib.h>

    – pmg

    28 de marzo de 2011 a las 14:34

  • gracias por su rápida respuesta, ¿podría explicar un poco más sobre la función “system()”, o podría mostrarme otro ejemplo de cómo llamar a esta función?

    – wa-ja

    28 de marzo de 2011 a las 15:14

  • @charlie: puede hacer clic en el sistema en mi publicación para ir a una descripción de la función. Básicamente, lo que pones entre paréntesis es lo que escribirías en el shell. Su programa ejecuta eso y espera hasta que finaliza.

    – pmg

    28 de marzo de 2011 a las 15:23

Para el caso más simple, debe tener dos programas compilados en un directorio:

> ls
.
hello
second

En el segundo programa solo necesitas llamar system("hello");

avatar de usuario
Basile Starynkevitch

Hice algunas búsquedas, y la gente sugirió el fork() y exec() funciones Otros dijeron que usar system(). No tengo conocimiento sobre estas funciones. ¿Cómo llamo a estas funciones? ¿Son apropiados para su uso?

Si. Lea primero la documentación (man página), por ejemplo de tenedor(2), ejecutivo(3), sistema(3). Es muy probable que tenga esa documentación localmente en su computadora, usando hombre(1). Darse cuenta de system usos sh (a través de bash(1) o guión (1)), porque es fork-En g, ejecutivo(2)-ing y esperar pid (2)-ing el /bin/sh carcasa POSIX.

pienso que fork es dificil de entender porque en caso de éxito devuelve “dos veces”. No intentaré explicarlo aquí (necesitaré muchas páginas para eso). recomiendo leer bifurcación (llamada al sistema) wikipage al principio. Luego, lea algún buen libro de programación de Linux, por ejemplo Programación avanzada de Linux (descargable gratuitamente).

Lea también sobre Espacio de direcciones virtualesy proceso(5).

También podrías leer Sistemas operativos: tres piezas sencillas para una vista más general.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad