L'Appel système fork() et la fonction execv
Je suis en train de lancer deux exécutables consécutivement à l'aide de ce code c:
#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[])
{
fork();
execv("./prcs1", &argv[1]); //GIVE ADDRESS OF 2nd element as starting point to skip source.txt
fork();
execv("./prcs2", argv);
printf("EXECV Failed\n");
}
Le programme s'arrête après la première execv() appel en dépit de la fourche, il n'arrive jamais à la deuxième execv(). J'ai essayé d'appeler wait() après la première fourche, mais je ne suis pas sûr que ce qu'il manque.
Des idées pourquoi le contrôle n'est pas de retour à la mère après que l'enfant quitte?
Ahh, l'ancien "fork et exec" l'idiome... malheureusement, il n'est pas tout à fait aussi littérale que vous l'avez.
Voulez-vous votre processus principal de bloquer et d'attendre que c'est l'exécution du processus fils?
Voulez-vous votre processus principal de bloquer et d'attendre que c'est l'exécution du processus fils?
OriginalL'auteur Mike | 2013-10-02
Vous devez vous connecter pour publier un commentaire.
Vous avez un couple de problèmes. Tout d'abord, si vous ne voulez exécuter deux programmes, vous ne devez appeler
fork()
une fois. Puis exécuter un programme dans le processus parent et celui de l'enfant. Deuxièmement, vous êtes la construction de laargv
tableau pour être passé àexecv
de manière incorrecte. La première entrée doit être le nom de l'exécutable. Faire quelque chose comme:Notez que cet exemple n'a pas de contrôle d'erreur.
return 0
:-SOuais; juste essayer de fermer le système. Je suppose que si un
execv
échoue il devrait être là.Aucun moyen de parvenir à ce point est une erreur... mais pour être sûr, j'avais aussi ajouter
_exit(EXIT_FAILURE)
après l'enfantexec
.OK, amélioré sur la base de commentaires.
Sans vouloir pinailler, mais après une récente série de blocages grâce à tcmalloc et
pthread_atfork
, je voudrais vraiment insister pour utiliser_exit
de l'enfant. C'est juste très dangereux de continuer après une fourche. Je suppose que si l'application est garanti d'être mono-thread (est-ce que votre programme d'allocation de promesse? le savez-vous?), vous avez peut être bien, mais pourquoi prendre le risque.OriginalL'auteur Carl Norum
Vous devez comprendre comment la fourche et execv travailler ensemble.
Vous avez besoin stdlib de sortie (dans le cas execv échoue), et errno, pour imprimer la raison,
Vous pourriez vouloir examiner la raison de votre enfant est sorti (vidage de la mémoire, signal, la sortie normale), donc j'ai ajouté cette fonction,
Et voici votre programme annoté avec les commentaires expliquant les sections de code sont traitées par les parents, et qui, par le ou les enfant(s).
OriginalL'auteur ChuckCottrill
Vous n'avez pas eu beaucoup de lecture sur fork (), je suppose.
lorsque vous appelez
fork()
, il crée un processus fils qui va exécuter le même code à partir de la fourche.fork()
retourne trois types de valeursvotre code devrait ressembler à ceci.
code from fork
. Ceci est important car le code n'est pas de recommencer mais l'ensemble de données et de pile sont copiés alors que le texte reste le même dans la Région de la table avec une nouvelle copie de Compteur de Programme. Je pense que c'est la plus pertinente réponse.OriginalL'auteur Dhaval
L'exec de la famille ne reviendra que si l'appel échoue.
Puisque vous ne cochez pas la valeur de retour de fork, vous appelez execv dans le parent et l'enfant processus.
Vérifier la valeur de retour: si il est à 0, vous êtes dans le processus de l'enfant, s'il est plus grand que zéro, vous êtes dans le processus parent. Au-dessous de zéro signifie que la fourche a échoué.
Eh bien, il revient sur l'échec, mais vous avez raison ... je vais modifier la réponse
OriginalL'auteur LostBoy