2016-10-15 10 views
1

親プロセスの2つの子プロセスを作成するプログラムを作成しました。このプログラムはプロセスIDを示す親のプロセスを出力し、次にそのIDと親のIDを示す2つの子プロセスを出力します。親プロセスは、プログラムが終了して出力を出力した後に、wait()関数を使用して子プロセスを取得することになっています。あまりにも多くのプロセスを作成して親プロセスのみを終了するようです

ただし、私のプログラムは親プロセスの作成と子プロセスの保持を続けます。私は、2つの子プロセスに対して1つの親プロセスしか必要としません。 whileループの内部では、子プロセスの変更された状態をチェックし、 "Child 'xxx' process terminated"を印刷すると想定されるwait()関数があります。代わりに、親プロセスやその他のランダムプロセスのいくつかを終了しています。

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

int main() 
{ 
    pid_t cpid, cpid2, wpid; 
    int child = fork(); 
    int child2 = fork(); 
    int status; 

    if ((child = fork()) == 0){ 
     child = cpid; 
    } 
    if((child2 = fork()) == 0){ 
     child2 = cpid2; 
    } 
    else{ 
     printf("I am the parent %d\n", getppid()); 
     printf("I am the process %d created by %d\n", cpid, getppid()); 
     printf("I am the process %d created by %d\n", cpid2, getppid()); 

     while ((wpid = wait(&status)) > 0){ 
     printf("Child process %d terminated\n", wpid); 
     } 

    } 

    return (0); 

} 

あなたfork()たら私の出力は、子と親の両方が、あなたが唯一の親プロセスでfork()を呼び出したい場合は、戻り値をチェックし、再びfork()を呼び出している、私にこの

I am the parent 5764 
I am the process 2 created by 5764 
I am the process 6411548 created by 5764 
I am the parent 13720 
I am the process 2 created by 13720 
I am the process 6411548 created by 13720 
I am the parent 23612 
I am the process 2 created by 23612 
I am the process 6411548 created by 23612 
I am the parent 15096 
I am the process 2 created by 15096 
I am the process 6411548 created by 15096 
I am the parent 24276 
I am the process 2 created by 24276 
I am the process 6411548 created by 24276 
I am the parent 13720 
I am the process 2 created by 13720 
I am the process 6411548 created by 13720 
I am the parent 13720 
I am the process 2 created by 13720 
I am the process 6411548 created by 13720 
I am the parent 5764 
I am the process 2 created by 5764 
I am the process 6411548 created by 5764 
Child process 17016 terminated 
Child process 18584 terminated 
Child process 13984 terminated 
Child process 8480 terminated 
Child process 10816 terminated 
Child process 21968 terminated 
Child process 23388 terminated 
Child process 11452 terminated 
Child process 2776 terminated 
Child process 19328 terminated 
Child process 17116 terminated 
Child process 18352 terminated 
Child process 24276 terminated 
Child process 15096 terminated 
Child process 5764 terminated 
+1

最初のフォークの親と子の両方が残りのプログラムを実行し続けることを許可しています。彼らは*両方とも*フォークをもう一度進めます。 –

+1

'cpid'と' cpid2'は使用時に未定義です – Tibrogargan

+0

"fork"の呼び出しを削除します "int child = fork(); int child2 = fork();" –

答えて

3

を示しています再びフォークする前に。それは親に子供PIDを返し、子で0fork()戻り

int child = fork(); 
// This will be called by both, the child and the parent 
int child2 = fork(); 

1

最初の子、あなたfork()が第二子をフォークして、また、あなたが最初fork()

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

#include <stdlib.h> 

int main() 
{ 
    pid_t cpid, cpid2, wpid; 
    int child = fork(); 
    int child2 = fork(); 
    int status; 

    if ((child = fork()) == 0){ 
     child = cpid; 
    } 
    else { 
     if((child2 = fork()) == 0){ 
      child2 = cpid2; 
     } 
     else{ 
      printf("I am the parent %d\n", getppid()); 
      printf("I am the process %d created by %d\n", cpid, getppid()); 
      printf("I am the process %d created by %d\n", cpid2, getppid()); 

      while ((wpid = wait(&status)) > 0){ 
       printf("Child process %d terminated\n", wpid); 
      } 
    } 

のために、他のあなたがそれをやっている方法を処理していない、最初の子は、それ自身の子をフォークれ返されたPID!= 0の場合のハンドラを定義します。したがって、2番目の子を2つ生成し、親ケースを2回処理します。

2

はじめに、getppid/getpidのマニュアルページだけでなく、フォークのマニュアルページも読んでください。フォークのドキュメントから

:成功し

、子プロセスのPIDは、親の実行 スレッドに返され、0は 子の実行スレッドに返されます。失敗すると、親のコンテキストに-1が返され、 子プロセスは作成されず、errnoが適切に設定されます。

if ((child = fork()) == 0){ 
    printf(" %u and %u", getpid(), getppid()); 
} else{ /* avoids error checking*/ 
    printf("Parent - %u ", getpid()); 
} 
+0

だから私は上のコードを使って遊んで、2人の子供を持つ親を作ることができました。しかし、私は別のプロセスから3番目の子を取得しています。 –

+1

if((child = fork())== 0){ \t \t printf( "私は%u \ nによって作成された子%uです"、getpid() getppid()); \t} else {/ *エラーチェックを避ける*/ \t \t printf( "私は親です - %u \ n"、getpid()); \t} \t \t IF((child2の=フォーク())== 0){ \t \tのprintf(())(GETPID getppid、 "I Uが%によって作成された子%UはN \午前")。 \t} –

+0

2つのif文を作成する代わりに、1を作成し、2つの条件の間に** && **を追加するのではなく、これはあなたの問題を解決するはずです。 @ericeric – Vedant

関連する問題