Sous Linux, j'aimerais écrire un programme en C qui lance un autre programme. Lorsque le programme est exécuté, le shell attend que vous saisissiez une commande que vous avez définie dans votre programme. Cette commande lancera le deuxième programme.
Par exemple, supposons qu’un programme C simple appelé "hello" se trouve dans le même répertoire que le programme appelant. Le programme "hello" imprime la sortie "hello, world". Le premier programme serait exécuté et l'utilisateur entrerait la commande "hello". Le programme "hello" serait exécuté et "hello, world". serait sortie vers le shell.
J'ai fait des recherches et les gens ont suggéré les fonctions "fork ()" et "exec ()". D'autres ont dit d'utiliser "system ()". Je n'ai aucune connaissance sur ces fonctions. Comment appeler ces fonctions? Sont-ils appropriés à utiliser?
Exemple de code avec des explications serait très utile. D'autres réponses sont également les bienvenues. Votre aide est grandement appréciée.
#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;
}
Si vous débutez dans fork, une représentation graphique de fork et de exec peut vous être utile.
Représentation de fork()
+-------------+
|main program |
+-------------+ (fork())
|___________________________
+-------------+ |
|main program | +-------------+
+-------------+ |main program |
| +-------------+
+-------------+ | (exec())
|main program | +-------------+
+-------------+ |hello program|
+-------------+
Comme vous l'avez peut-être déjà lu dans un didacticiel, après avoir appelé fork()
, une copie du programme existant est créée et le exec()
qui suit remplace cette copie par le nouveau programme que vous lui transmettez en tant qu'arguments. Deux unités d'exécution pour deux programmes fonctionneront après fork()
.
Est-ce que system()
ne suffira pas
/* ... */
if (!strcmp(cmd, "hello")) system("hello.exe");
/* ... */
Pour le cas le plus simple, vous devriez avoir deux programmes compilés dans un répertoire:
> ls
.
hello
second
Dans le deuxième programme, il vous suffit d'appeler system("hello");
J'ai fait des recherches et les gens ont suggéré les fonctions
fork()
etexec()
. D'autres ont dit d'utilisersystem()
. Je n'ai aucune connaissance sur ces fonctions. Comment appeler ces fonctions? Sont-ils appropriés à utiliser?
Oui. Lisez d'abord la documentation (page man
), par exemple. de fork (2) } _, exec (3) , system (3) . Très probablement, vous avez cette documentation localement sur votre ordinateur, en utilisant man (1) . Notez que system
utilise sh
(thru bash (1) ou tiret (1) ), car il s'agit de fork
ing, execve (2) } _ing et waitpid (2) } _ing the /bin/sh
POSIX Shell.
Je pense que fork
est difficile à comprendre car, en cas de succès, il revient "deux fois". Je n'essaierai pas de l'expliquer ici (il me faudra beaucoup de pages pour cela). Je recommande de lire fork (appel système) } _wikipage au début. Lisez ensuite un bon livre de programmation Linux, par exemple Programmation Linux avancée (téléchargeable gratuitement).
Lisez également à propos de espace d'adressage virtuel et proc (5) .
Vous pouvez également lire Systèmes d'exploitation: Trois pièces faciles pour une vue plus générale.