J'essaie de créer un programme qui utilise Fork () pour créer un nouveau processus. La sortie de l'échantillon devrait ressembler à:
Ceci est le processus enfant. Mon PID est de 733 et l'ID de mon parent est 772.
C'est le processus parent. Mon PID est 772 et l'ID de mon enfant est de 773. P>
C'est comme ça que j'ai codé mon programme: p> Il en résulte la sortie: P > C'est le processus d'enfant. Mon PID est 22163 et l'ID de mon parent est 0. Pourquoi est-ce qu'il imite deux fois la déclaration et comment puis-je l'obtenir correctement d'afficher l'ID du parent après l'affichage de l'ID enfant dans la première phrase? P > EDIT: P>
C'est le processus d'enfant. Mon PID est 22162 et l'ID de mon parent est 22163. P> #include <stdio.h>
#include <stdlib.h>
int main() {
int pid = fork();
if (pid == 0) {
printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), getppid());
}
else {
printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), pid);
}
return 0;
}
5 Réponses :
Il s'agit d'impression deux fois parce que vous appelez à deux reprises Printf, une fois dans l'exécution de votre programme et une fois dans la fourchette. Essayez de prendre votre fourchette () hors de l'appel Printf. P>
Commencez par lisant le Fork Man ainsi que le getppid / getpid homme pages.
de Fork's P>
sur le succès, le PID du processus enfant est renvoyé dans le parent le fil d'exécution et un 0 est renvoyé dans le fil de l'enfant de exécution. Lors de l'échec, A -1 sera retourné dans le contexte du parent, Aucun processus enfant ne sera créé et errno sera défini de manière appropriée. P> blockQuote>
Donc, cela devrait être quelque chose dans les lignes de p>
xxx pré> sur votre question: p>
C'est le processus d'enfant. Mon PID est 22163 et l'ID de mon parent est 0. P>
C'est le processus d'enfant. Mon pid est 22162 et l'identifiant de mon parent est 22163. P> blockQuote>
fourchette () code> Exécute avant le
printf code>. Donc, lorsque c'est fait, vous avez deux processus avec les mêmes instructions à exécuter. Par conséquent, PrintF exécutera deux fois. L'appel à
Fork () code> retournera
0 code> au processus enfant et le
pid code> du processus enfant au processus parent. P >
Vous obtenez deux processus en cours d'exécution, chacun exécutera cette instruction Strike> instruction: p>
xxx pré> et p>
xxx < / PRE> ~ P>
Pour le terminer, la ligne ci-dessus est l'enfant, en spécifiant son
pid code>. La deuxième ligne est le processus parent, spécifiant son ID (22162) et son enfant (22163). P> P>
Et il imprime deux fois parce que ... (de l'homme de Fork's): Une fois qu'un nouveau processus enfant est créé, les deux processus exécuteront les instructions suivantes à la suite de l'appel du système Fork (). Par conséquent, nous devons distinguer le parent de l'enfant. Cela peut être fait en testant la valeur renvoyée de la fourchette ()
Merci beaucoup, c'était une bonne rupture. J'ai édité mon code révisé ci-dessus. Il semble fonctionner correctement. Voulez-vous vous déranger de vérifier que ma logique est correcte?
@Raphnguyen Tout le monde doit appeler getppid () code> pour obtenir l'ID de processus de leur parent. Dans votre échantillon, le processus parent imprimera à la place de son identifiant de processus enfant.
Il imprime la déclaration deux fois parce qu'il l'imprime à la fois pour le parent et l'enfant. Le parent a un identifiant parent de 0
Essayez quelque chose comme ceci: p>
C'est la bonne façon d'obtenir la sortie correcte ... Cependant, l'identifiant parent des enfants peut parfois être imprimé comme 1 parce que le processus parent est terminé et le processus racine avec PID = 1 contrôle ce processus orphelin.
pid_t pid; pid = fork(); if (pid == 0) printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), getppid()); else printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), pid);
Nous contrôlons le processus de traitement de la fourchette (). Voir mon code ci-dessous:
int main() { int forkresult, parent_ID; forkresult=fork(); if(forkresult !=0 ) { printf(" I am the parent my ID is = %d" , getpid()); printf(" and my child ID is = %d\n" , forkresult); } parent_ID = getpid(); if(forkresult ==0) printf(" I am the child ID is = %d",getpid()); else printf(" and my parent ID is = %d", parent_ID); }
Votre programme n'essaie pas d'imprimer les mots «processus parent» n'importe où. Ils ne sont pas présents dans le texte du programme, pourquoi vous attendez-vous à ce qu'ils soient imprimés?
Man Fork Code>. Lis le. Comprendre les mots. Allez sur Stackoverflow lorsque vous n'avez pas de moyen de trouver la réponse vous-même. Vous serez un meilleur programmeur pour cette expérience.
En outre,
Fourchette code> ne renvoie pas un identifiant de processus parent à l'enfant. Il retourne 0 à l'ID de l'enfant et de l'enfant au parent. C'est comme ça que vous savez lequel est lequel.