comment utiliser correctement fork() et exec()
J'ai ce code;
pid_t process;
process = fork();
if (process < 0){
//fork error
perror("fork");
exit(EXIT_FAILURE);
}
if (process == 0){
//i try here the execl
execl ("process.c", "process" , n, NULL);
}
else {
wait(NULL);
}
Je ne sais pas si cette utilisation de fork()
et exec()
combiné est correct. Lorsque j'essaie d'exécuter le programme à partir du bash je ne reçois pas de résultat, donc j'ai pensé qu'il pourrait être un problème dans cette partie de code.
Merci.
Essayez d'utiliser
-wall
🙂OriginalL'auteur Sicioldr | 2011-12-03
Vous devez vous connecter pour publier un commentaire.
Un problème, c'est que
devrait lire
Sinon, vous êtes attribution zéro à
process
et en n'appelantexecl
siresult
est non nul (c'est à dire jamais).Aussi, vous essayez de exec quelque chose qui s'appelle
process.c
. Il n'y a pas de doute que l'on pouvait avoir un exécutable appeléprocess.c
. Cependant, conventionnellement les noms se terminant en.c
sont donné à C fichiers de code source. Siprocess.c
est en effet un fichier C, vous devez compiler et lier le tout premier.Une fois que vous avez construit le fichier exécutable, vous devez le placer quelque part sur
$PATH
ou indiquez son chemin d'accès complet àexecle()
. Dans de nombreux environnements Unix de le placer dans le répertoire courant n'est pas assez.Enfin, on ne sait pas ce que
n
est dans leexecle()
appel, mais le nom fait allusion à une variable numérique. Vous devez vous assurer que c'est une chaîne et non pas, par exemple, un entier.j'ai compilé, mais comment puis-je lier mon code?
Vous n'avez pas besoin de le relier à votre code, il vous suffit de produire un exécutable. Le compilateur appelle souvent l'éditeur de liens par défaut. E. g. avec gcc, il vous suffit d'exécuter
gcc -o process process.c
et vous obtiendrez un fichier exécutable appeléprocess
.J'ai fait un makefile dans lequel j'ai compiler tous mes fonctions, j'ai un exécutable appelé "processus". Mais je ne sais pas si c'est suffisant. Est-il possible de passer des arguments numériques dans le ececl sans plâtre?
Un casting ne sera pas vous faire du bien, comme de ne pas allouer de la mémoire pour la chaîne... à vous de conversion tout à chaînes.
OriginalL'auteur NPE
Ainsi que par les réponses et les commentaires au-dessus de votre code devrait ressembler à quelque chose comme ceci
Notez l'utilisation de vfork au lieu d'une fourchette.Sa parce qu'il serait beaucoup plus efficace.La raison pourrait être trouvée ici
n
aprèsvfork()
le processus s'exécute dans un comportement indéterminé. Utilisationfork()
si modifier toutes les variables avant deexec*()
ing.OriginalL'auteur bashrc