2013-08-09 4 views
3

La valeur pid parent a été confondue avec le bloc de processus enfant. Mon programme est donné ci-dessous:ID de processus enfant et parent

int main(int argc, char *argv[]) 
    { 
    pid_t pid; 
    pid=fork(); 
    if(pid==-1){ 
      perror("fork failure"); 
      exit(EXIT_FAILURE); 
    } 
    else if(pid==0){ 
      printf("pid in child=%d and parent=%d\n",getpid(),getppid()); 
    } 
    else{ 
      printf("pid in parent=%d and childid=%d\n",getpid(),pid); 
    } 
    exit(EXIT_SUCCESS); 
    } 

Sortie: pid dans parent = 2642 et childID = 2643

pid chez l'enfant = 2643 et parent = 1

"Programmation Unix avancée", il dit ce processus enfant peut obtenir l'ID du processus parent en utilisant la fonction getppid(). Mais ici, je reçois "1" qui est "init" processus id.

Comment puis-je obtenir la valeur pid parent dans le bloc de processus enfant. Aidez-moi à obtenir une sortie.

J'ai exécuté dans "Linux Mint OS" mais dans "OS WindRiver" je ne reçois pas ce problème. Ce programme change-t-il le comportement en fonction du système d'exploitation?

+0

double possible de [Pourquoi getppid() du retour de l'enfant 1] (http://stackoverflow.com/questions/16078188/why-getppid-from-the-child-return-1) – melpomene

Répondre

2

C'est parce que le père peut/va sortir avant le fils. Si un père existe sans avoir demandé la valeur de retour de son enfant, l'enfant sera possédé par le processus avec pid = 1. Ce qui est sur les systèmes UNIX ou GNU classiques SystemV init.

La solution est d'utiliser waitpid() en père:

int main(int argc, char *argv[]) 
{ 
    pid_t pid; 
    pid=fork(); 
    if(pid==-1){ 
     perror("fork failure"); 
     exit(EXIT_FAILURE); 
    } 
    else if(pid==0){ 
     printf("pid in child=%d and parent=%d\n",getpid(),getppid()); 
    } 
    else{ 
     printf("pid in parent=%d and childid=%d\n",getpid(),pid); 
    } 

    int status = -1; 
    waitpid(pid, &status, WEXITED); 

    printf("The child exited with return code %d\n", status); 
    exit(EXIT_SUCCESS); 
} 
+0

Je mets "sleep (2)" à la fin du programme et fonctionne bien et votre réponse est correcte. –

0

Après la fourche, vous avez deux nouveaux processus et vous pouvez connaître l'identifiant de l'enfant dans le parent, mais pas l'inverse. Si vous en avez vraiment besoin, vous devrez ouvrir un tuyau (popen) avant la fourche, puis le parent pourrait écrire ceci dans le tuyau et l'enfant pourrait le lire.

1

Une fois que le parent, il a terminé son exécution et de l'enfant est toujours en cours d'exécution. Alors l'enfant est connu comme orphelin (comme son parent est mort) et il est adopté par le processus init si vous êtes connecté par root (dont pid = 1).

Si vous souhaitez que l'enfant sorte d'abord avant parent, utilisez l'appel système wait() et ses variantes.

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

int main() 
{ 
    int pid,pid2; 
    pid=fork(); 

    if (pid<0) { 
    printf("fork failed"); 
    exit(-1); 
    } else if (pid==0) { 
    printf("child id is%d",getpid()); 
    execlp("/bin/ls","is",NULL); 
    printf("\nsleeping for 2 seconds using pid of child class"); 
    sleep(2); 

    printf("killing the child process"); 
    kill(getpid()); 
    } else { 
    wait(NULL); 
    printf("The parent id is %d\n",getpid()); 
    printf("The child id is %d\n",getpid()); 
    printf("\nsleeping for 3 seconds without pid"); 
    sleep(3); 
    printf("\nchild completed\n"); 

    exit(0); 
    } 
} 
+1

donnez une explication à votre réponse –

+0

Ceci est un programme c de base pour calculer l'identifiant enfant et l'identifiant parent, y compris la fonction sommeil. –