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 de exec()
combinés est correcte. Lorsque j’essaie d’exécuter le programme à partir de la bash, je ne reçois aucun résultat. J’ai donc pensé que cela pourrait poser problème dans cette partie du code.
Merci.
Un problème est que
if (process = 0){
Devrais lire
if (process == 0){
Sinon, vous affectez zéro au process
et appelez seulement execl
si le result
est différent de zéro (c’est-à-dire jamais).
En outre, vous essayez d’exécuter quelque chose appelé process.c
. Il ne fait aucun doute que l’on pourrait avoir un exécutable appelé process.c
. Cependant, les noms se terminant classiquement par .c
sont atsortingbués aux fichiers de code source C. Si process.c
est effectivement un fichier C, vous devez d’abord le comstackr et le lier.
Une fois que vous avez construit l’exécutable, vous devez soit le placer quelque part sur $PATH
soit spécifier son chemin complet d’access à execle()
. Dans de nombreux environnements Unix, le placer dans le répertoire actuel ne suffira pas.
Enfin, on ne sait pas ce que n
est dans l’appel execle()
, mais le nom fait allusion à une variable numérique. Vous devez vous assurer qu’il s’agit d’une chaîne et non, par exemple, un entier.
Eh bien, selon les réponses et les commentaires ci-dessus, votre code devrait ressembler à ceci:
pid_t process; process = vfork(); //if your sole aim lies in creating a child that will ultimately call exec family functions then its advisable to use vfork if (process < 0) { //fork error perror("fork"); exit(EXIT_FAILURE); } if (process == 0) { //i try here the execl char N[MAX_DIGITS];//A correction here itoa(n,N);//write this function yourself execl ("process", "process" , N, NULL);// Here process is the name of the executable N is your original argument fprintf(stderr,"execl failed\n");//check for error in execl } else { wait(NULL); }
Notez l’utilisation de vfork au lieu de fork.Cela serait beaucoup plus efficace.La raison pourrait être trouvée ici