2016-10-02 7 views
2

このプログラムでは、子プロセスの印刷が間違っているのはなぜですか?子プロセスが間違った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(); 
} 

出力:

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 

私は場合は再実行してください。時々出力は私が期待しているものであり、時には予期せぬものです。

+1

some sleep();を追加しようとしています。親プロセスでは、あなたはあなたが期待しているものを得るだろうと思います。問題は次のようなものです。https://en.wikipedia.org/wiki/Orphan_process –

答えて

1

理由を見つけました。それは愚かでした。親プロセスが最初に終了するので、initプロセスによって子プロセス(孤児)が採用されています。

私のケースでは、プロセスID 1810

成り上がりで成り上がりである/ sbinに/ initを

1

ためのイベントベースの交換は確かに、スケジューラという保証はありません最初に息子のプロセスをスケジュールします。息子プロセスが実行される前に、親プロセスが終了することがあります。そして、Linuxではすべてのプロセスに親プロセスがあり(swapperプロセスを除く)、孤児はinitに割り当てられます。

親プロセスが子プロセスを待つようにwait()を追加できます。

関連する問題