web-dev-qa-db-fra.com

fork () processus parent et enfant

J'essaie de créer un programme qui utilise fork () pour créer un nouveau processus. L'exemple de sortie devrait ressembler à ceci:

Ceci est le processus enfant. Mon pid est 733 et l'identifiant de mon parent est 772.
Ceci est le processus parent. Mon pid est 772 et l'identifiant de mon enfant est 773.

Voici comment j'ai codé mon programme:

#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), fork());

    return 0;
}

Cela se traduit par la sortie:

Ceci est le processus enfant. Mon pid est 22163 et l'identifiant de mon parent est 0.
Ceci est le processus enfant. Mon pid est 22162 et l'ID de mes parents est 22163.

Pourquoi imprime-t-il la déclaration deux fois et comment puis-je l'obtenir pour qu'il affiche correctement l'ID du parent après que l'ID de l'enfant s'affiche dans la première phrase?

MODIFIER:

#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;
}
6
raphnguyen

Commencez par lire la page de manuel fork ainsi que les pages getppid / getpid man.

De la fourchette

En cas de succès, le PID du processus enfant est renvoyé dans le thread d'exécution Du parent et un 0 dans le thread d'exécution enfant de . En cas d'échec, -1 sera renvoyé dans le contexte du parent, Aucun processus enfant ne sera créé et errno aura le même résultat.

Donc, cela devrait être quelque chose sur les lignes de

if ((pid=fork())==0){
    printf("yada yada %u and yada yada %u",getpid(),getppid());
}
else{ /* avoids error checking*/
    printf("Dont yada yada me, im your parent with pid %u ", getpid());
}

En ce qui concerne votre question:

Ceci est le processus enfant. Mon pid est 22163 et l'identifiant de mon parent est 0.

Ceci est le processus enfant. Mon pid est 22162 et l'identifiant de mes parents est 22163.

fork() s'exécute avant la printf. Donc, quand c'est fait, vous avez deux processus avec les mêmes instructions à exécuter. Par conséquent, printf sera exécuté deux fois. L'appel à fork() renverra 0 au processus enfant, et la pid du processus enfant au processus parent.

Vous obtenez deux processus en cours d'exécution, chacun exécutera ceci instruction déclaration:

printf ("... My pid is %d and my parent's id is %d",getpid(),0); 

et

printf ("... My pid is %d and my parent's id is %d",getpid(),22163);  

Pour terminer, la ligne ci-dessus est l’enfant, en spécifiant sa pid. La deuxième ligne est le processus parent, spécifiant son identifiant (22162) et son enfant (22163).

12
Tom

Il imprime la déclaration deux fois, car il l’imprime à la fois pour le parent et pour l’enfant. Le parent a un identifiant parent de 0

Essayez quelque chose comme ça:

 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(), getppid() );
2
Hogan

Nous contrôlons l'appel de processus fork () par l'instruction if, else. 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);
}
1

C’est le bon moyen d’obtenir la sortie correcte .... Cependant, l’identifiant parent de l’enfant peut parfois être imprimé en tant que 1 car le processus parent est arrêté 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);
0
Nitish Jain

Il imprime deux fois parce que vous appelez deux fois printf, une fois dans l'exécution de votre programme et une fois dans la fourche. Essayez de sortir votre fork () de l'appel printf.

0
Daniel Pereira