Après le retour de execvp, pourquoi mon programme ne reprend-il pas où il s’est arrêté?

J’ai un bloc de code comme celui-ci qui fonctionne en tant que thread enfant:

if(someVar == 1){ doSomeStuff; _exit(0) } else execvp(*(temp->_arguments), temp->_arguments); printf("I'm done\n"); 

Lorsque j’exécute le programme avec someVar == 1, je comprends que l’appel _exit (0) tue mon thread. Cependant, lorsqu’il est défini sur 0, pourquoi le programme ne continue-t-il pas après l’appel de execvp () et exécute l’instruction printf?

Si vous exec* (appelez n’importe quelle fonction exec de la famille exec), le code d’un nouveau programme est chargé dans votre processus actuel et l’exécution se poursuit avec sa fonction principale et son contenu. Si ces fonctions sont exécutées avec succès, elles ne seront jamais renvoyées car votre printf n’existe plus en mémoire.

Je pense que vous confondez exec* avec la fonction fork . Cela divisera un nouveau processus enfant qui exécutera le même code que le parent.

Si vous voulez créer un nouveau thread, qui partage les données et l’espace d’adressage avec le thread principal, vous devez utiliser la fonction pthread_create . Un nouveau processus ne partagera pas de données et vous devrez communiquer avec l’autre processus en utilisant d’autres mécanismes, tels que les canaux ou la mémoire partagée.

execvp () écrase votre programme avec le nouvel exécutable et ne retourne pas, sauf si une erreur survient. Vous devez d’abord fork () , puis appeler exec * sur le processus enfant.

parce que execvp remplace le processus que vous execvp le processus que vous avez exécuté. Si execvp revient, c’est parce qu’il a échoué. Il ne devrait pas revenir autrement.