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

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");
/* ... */
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");

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.