web-dev-qa-db-fra.com

getpid et getppid retournent deux valeurs différentes

Quand je lance le code ci-dessous 

#include <stdio.h>
#include <sys/types.h>
//int i=0;
int main(){

int id ;
id = fork() ;
printf("id value : %d\n",id);
    if ( id == 0 )
    {
    printf ( "Child : Hello I am the child process\n");
    printf ( "Child : Child’s PID: %d\n", getpid());
    printf ( "Child : Parent’s PID: %d\n", getppid());
    }
    else
    {
    printf ( "Parent : Hello I am the parent process\n" ) ;
    printf ( "Parent : Parent’s PID: %d\n", getpid());
    printf ( "Parent : Child’s PID: %d\n", id);
    } 

}

Ma sortie est

id value : 20173
Parent : Hello I am the parent process
Parent : Parent’s PID: 20172
Parent : Child’s PID: 20173
id value : 0
Child : Hello I am the child process
Child : Child’s PID: 20173
Child : Parent’s PID: 1

En quoi le PID du parent (20172) peut-il différer de celui du parent de l'enfant (1)? Ces deux personnes ne devraient-elles pas être égales?

16
Assasins

Ce qui se passe, c'est que le parent se termine avant que l'enfant ne s'exécute. cela laisse l'enfant comme orphelin et il est adopté par le processus racine avec le PID égal à 1. Si vous mettez un délai ou lisez des données depuis stdin plutôt que de laisser le parent se terminer, vous verrez le résultat que vous attendez. 

Process ID 1 est généralement le processus init principalement responsable du démarrage et de l'arrêt du système. Init (abréviation d'initialisation) est un processus démon qui est l'ancêtre direct ou indirect de tous les autres processus. lien wiki pour init

Comme le fait remarquer l'utilisateur 314104, les fonctions wait () et waitpid () sont conçues pour permettre à un processus parent de se suspendre jusqu'à ce que l'état d'un processus enfant change. Ainsi, un appel à wait () dans la branche parent de votre instruction if obligerait le parent à attendre que l'enfant se termine. 

24
Jackson

Le processus parent étant épuisé et libéré, son processus enfant est devenu un orphelin. Le processus init (abréviation d'initialisation) dont le pid est 1 a reçu le processus orphelin.

0
Stone.Carton