2017-03-04 1 views
1

J'essaie de comprendre le consept du processus. J'ai donc écrit un programme comme celui-ci:pourquoi parent.getpid() et child.getppid() différent

#include<stdio.h> 
#include<sys/types.h> 
#include<unistd.h> 
int main() { 
    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 child's id is %d.\n", getpid(), pid); 
} 

Je pensais ce programme imprimerait quelque chose comme

This is the parent process. My pid is 2283 and my child's id is 2284. 
This is the child process. My pid is 2284 and my parent's id is 2283. 

Mais au contraire, elle imprime cette

This is the parent process. My pid is 2283 and my child's id is 2284. 
This is the child process. My pid is 2284 and my parent's id is 1086. 

A la fin de la deuxième ligne , le pid parent de l'enfant est différent du pid du processus parent. Pourquoi cela se produit-il? Y a-t-il quelque chose qui me manque?

Merci à l'avance

+0

J'ai testé votre échantillon et ne peux pas reproduire le comportement que vous décrivez. Sur mon système cela fonctionne comme vous (et moi) attendez. J'ai Windows 10, cygwin, gcc 5.4.0. Étrange ... – Scheff

+0

Je l'ai testé aussi sur [coliru] (http://coliru.stacked-crooked.com/a/55a061ea3b2c1c6a). Le même résultat - cela fonctionne comme prévu. – Scheff

+0

Je lance ce programme sur Oracle VM Ubuntu. Cela arrive-t-il à cause de cela? –

Répondre

1

Le soupçon de Tony Tannous était correcte: L'enfant peut vivre plus longtemps que le parent. Lorsque le parent quitte son processus fils, il est "raccroché", c'est-à-dire qu'il devient un processus fils du processus init.

J'ai modifié l'exemple de code de OP pour forcer le processus fils à vivre plus longtemps que le processus parent.

#include<stdio.h> 
#include<sys/types.h> 
#include<unistd.h> 

int main() 
{ 
    pid_t pid; 
    pid = fork(); 
    if (pid == 0) { 
    sleep(1); /* 1 s */ 
    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 child's id is %d.\n", getpid(), pid); 
    } 
    return 0; 
} 

Compilé et testé avec gcc sur Cygwin:

$ gcc -o test-pid-ppid test-pid-ppid.c 

$ ./test-pid-ppid 
This is the parent process. My pid is 10748 and my child's id is 10300. 

$ This is the child process. My pid is 10300 and my parent's id is 1. 

Dans mon test, cela est évident en raison de la 1 spécifique PID (PID le processus d'initialisation obtient habituellement). Je suis un peu surpris PID 1086 observée dans l'OP, mais:

  1. Il n'y a pas de spécification (je sais) ce processus init doit obtenir PID 1 - sa seule habitude.
  2. L'OP a été exécuté sur une machine virtuelle. Là-bas, peut-être, les choses sont faites un peu différent que d'habitude ...

En ce qui concerne ma conviction qu'un processus de sortie tuerait tous ses enfants, j'ai étudié plus loin et trouvé ceci: Is there any UNIX variant on which a child process dies with its parent?. En bref: ma croyance était fausse. Merci pour cette question qui m'a forcé à l'illumination.