En attente de execvp en main

int main() { ... if(!fork()) { execvp(cmdName,cmdParam); } printf("In main()..."); return(0); } 
  1. En supposant que j’ai correctement passé les arguments cmdName & cmdParam, comment puis-je attendre la fin du processus créé par execvp avant de reprendre l’exécution de main ()?
  2. Est-ce que execvp () crée un processus qui est un enfant du processus nouvellement fork ()?

  1. Dans le processus parent, fork renvoie le PID du processus enfant, vous pouvez donc la stocker dans une variable, puis utiliser waitpid pour attendre la fin du processus enfant.

  2. Pas vraiment – le nouveau processus enfant créé par fork est une copie du parent et execvp remplace alors son image de processus par une nouvelle image. Effectivement, vous avez initialement deux «copies» du parent, dont l’un «devient» le nouveau programme.

Comme indiqué, vous devez enregistrer la valeur de l’appel fork. Vous devriez vraiment utiliser plus qu’un si sur la fourche. Il y a trois cas:

  1. 0: vous êtes le processus enfant
  2. 0: vous êtes le parent et vous avez récupéré un PID enfant

  3. -1: quelque chose d’horrible est arrivé et fork a échoué

Vous voulez vraiment connaître le cas 3, ça va gâcher votre journée entière. (aussi l’appel exec)

 int main() { int pid = fork(); if(-1 == pid) { fprintf(stderr, "Big problems forking %s\n", strerror(errno); exit(-1);//or whatever } else if (0 == pid) { if (-1 == execvp(cmdName,cmdParam)) { //like above, get some output about what happened } } //no need to else here, execvp shouldn't return // if it does you've taken care of it above waitpid(pid, NULL, 0); printf("Resuming main()..."); } 

return (0); }

Pour votre première question:

Utilisez waitpid (2) comme ceci:

 int pid = fork(); if (!pid) { execvp(cmdName, cmdParam); } waitpid(pid, NULL, 0); printf("Resuming main()...\n"); 

Pour la deuxième partie: tous les appels de fonction exec reprennent le processus (aucun d’eux ne revient)

Vous devez stocker la valeur de retour de fork() , qui renvoie une valeur différente pour chaque exécutable (0 si vous êtes le PID enfant si vous êtes le parent), puis effectuez un waitpid