2016-10-02 1 views
2

Dans ce programme, pourquoi l'impression de processus enfant est-elle incorrecte?Le processus enfant imprime incorrectement ppid()

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

void childprocess() 
{ 
    printf("Child: Hi I am the child process\n"); 
    printf("Child: My process id is %d\n", getpid()); 
    printf("Child: My parent is %d\n", getppid()); 
    printf("Child: I am exiting\n"); 
} 

void parentprocess() 
{ 
    printf("Parent: Hi I am the parent process\n"); 
    printf("Parent: My process id is %d\n", getpid()); 
    printf("Parent: My parent is %d\n", getppid()); 
    printf("Parent: I am exiting\n"); 
} 

int main() 
{ 
    pid_t n = fork(); 
    if(n<0) 
    { 
     perror("fork failed:"); 
     exit(EXIT_FAILURE); 
    } 
    else if(n==0) 
     childprocess(); 
    else 
     parentprocess(); 
} 

Sortie:

Parent: Hi I am the parent process 
Parent: My process id is 21550 
Parent: My parent is 7452 
Parent: I am exiting 
Child: Hi I am the child process 
Child: My process id is 21551 
Child: My parent is 1810 
Child: I am exiting 

Si je réexécuter. Parfois, la sortie est ce que j'attends et parfois c'est inattendu.

+1

essayez d'ajouter un peu de sommeil(); dans le processus parent et je suppose que vous obtiendrez ce que vous attendez. Le problème peut être le suivant: https://en.wikipedia.org/wiki/Orphan_process –

Répondre

1

J'ai trouvé la raison. C'était stupide. Le parent se termine en premier, donc l'enfant (orphelin) est adopté par le processus init.

Dans mon cas, il est le Upstart avec l'identifiant du processus 1810.

Upstart est un remplacement événementiel pour le/sbin/init

1

En effet, il n'y a aucune garantie que le planificateur ordonnera le processus de fils en premier. Le processus parent peut se terminer avant l'exécution du processus fils. Et puisque dans Linux chaque processus a un processus parent (à l'exception du processus swapper), l'enfant orphelin est assigné à init.

Vous pouvez ajouter un wait() afin que le processus parent attende le processus enfant.