2017-02-18 1 views
-1

プロセス(バイナリツリー)ごとに2つの子を作成しようとしていて、n = 3の場合プロセスツリー構造は(2)、(1)→(3)、(2)→(4)、(2)→(5)子プロセスごとに2つのプロセスがありますが、n =数値を指定し、バイナリツリー形式で渡された数値に基づいてプロセスを作成します。 私のコードは次のとおりです。各プロセスが2つ以上の子プロセスを持たないプロセスのバイナリツリー構造を作成しようとしています

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


int foo(const char *whoami) { 
    printf("I am a %s. My pid is:%d my ppid is %d\n", whoami, getpid(), getppid()); 
    return 1; 
} 

int func() 
{ 
    int pid = fork(); 

    if (pid==0) { 
     foo("child"); 

     int pid2 = fork(); 

    if (pid2==0) { 
     foo("child"); 


     exit(0); 
    } 
    else { 
     wait(NULL); 
    } 
    int pid3 = fork(); 

    if (pid3==0) { 
     foo("child"); 


     exit(0); 
    } 
    else { 
     wait(NULL); 
    } 
     exit(0); 
    } 
    else { 
     wait(NULL); 
    } 

    int pid1 = fork(); 

    if (pid1==0) { 
     foo("child1"); 

     int pid4 = fork(); 

    if (pid4==0) { 
     foo("child"); 


     exit(0); 
    } 
    else { 
     wait(NULL); 
    } 

    int pid5 = fork(); 

    if (pid5==0) { 
     foo("child"); 


     exit(0); 
    } 
    else { 
     wait(NULL); 
    } 
     exit(0); 
    } 
    else { 
     wait(NULL); 
    } 
    return 0; 
} 


int main() 
{ 
foo("parent"); 
func(); 
    return 0; 
} 
output : 

私は親です。私のPIDは:37私のppidは18です
私は子供1です。私のPIDは:38私のppidは37です
私は子供2です。私のPIDは:39私のppidは38
私はchild3です。私のpidは:40私のppidは38
私はchild4です。私のpidは:41私のppidは37
私は子供です。私のPIDは:42私のppidは41
私はchild5です。私のpidは次のとおりです。43私のPPIDは41

+0

私は子プロセスの数をn 'に関連して作成する方法を明確に理解していません'。これを明確にしてください。 (例えば、 'n'は2人の子供をフォークするプロセスの数、' n'はフォークされたプロセスの総数です...) – Scheff

+0

@Scheff私は、それぞれに2つの子を作成するプロセスのバイナリツリーを生成しようとしていますプロセスがn = 3を渡すと仮定すると、プロセスツリーは以下のようになります。 – Raj

+0

@Scheff I /\ /\ /\ /\ /\ 私が /\ 私私は – Raj

答えて

0

である私はラジはfork()wait()を理解し、まだ二分木の概念を取得していないことを前提としていたよう(と再帰関数を使用してそれらを実装する方法を)私は小さな完全なサンプルを作りましたこの。 fork()の使用を防ぎ、バイナリツリー/再帰の概念をより明確にします。 cygwinの上でgccで

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

void foo() 
{ 
    printf("child process %d, (%d)->(%d)\n", 
    getpid(), getppid(), getpid()); 
} 

/* creates child processes in binary tree manner. 
* 
* n ... number of tree nodes (child processes) to create 
*/ 
void do_fork(int n) 
{ 
    if (n <= 0) return; 
    int n1 = n/2; 
    int n2 = n - n1; 
    int pid1 = 0, pid2 = 0; 
    if (n1 >= 0) { 
    --n1; 
    pid1 = fork(); 
    if (pid1 < 0) { 
     fprintf(stderr, "ERROR: fork failed in process %d!\n", getpid()); 
     return; 
    } 
    if (pid1 == 0) { 
     foo(); 
     do_fork(n1); 
     exit(0); 
    } 
    } 
    if (n2 >= 0) { 
    --n2; 
    pid2 = fork(); 
    if (pid2 < 0) { 
     fprintf(stderr, "ERROR: fork failed in process %d!\n", getpid()); 
     return; 
    } 
    if (pid2 == 0) { 
     foo(); 
     do_fork(n2); 
     exit(0); 
    } 
    } 
    wait(NULL); 
} 

int main(int argc, char **argv) 
{ 
    int n = 3; /* number of binary tree nodes, might become input */ 
    printf("parent process %d, children to create: %d\n", getpid(), n); 
    if (n) do_fork(n); 
    return 0; 
} 

私がコンパイルされ、これをテストした:

完全にそれを置く

$ gcc -o test-bin-tree-fork test-bin-tree-fork.c 

$ ./test-bin-tree-fork.exe 
parent process 8628, children to create: 3 
child process 13608, (8628)->(13608) 
child process 7292, (8628)->(7292) 
child process 8920, (7292)->(8920) 
child process 14104, (7292)->(14104) 
+0

あなたが書いたコードは2回以上0を生成していますが、プロセスのバイナリツリーを作成しようとしています。n = 4の場合は偶数です親プロセスは2つの子プロセスを生成し、各子プロセスは2つの子プロセスを生成する必要があります.n = 3の場合は奇数です。バイナリツリープロセスは1つの親プロセスのようにして2つの子プロセスを生成し、子プロセスの場合 – Raj

+0

あなたが書いたコードは2回以上0を生成していますが、プロセスのバイナリツリーを作成しようとしています。n = 4の場合は親プロセスが2つの子プロセスを生成し、 2つの子プロセスn = 3の場合、奇数である場合、バイナリツリープロセスは1つの親プロセスのようになります – Raj

+0

@Raj私はthを変更しましたサンプルコード。私はあなたの追加仕様に(うまくいけば)マッチしました。しかし、この場合、 'n' *はフォークするプロセスの数ですが、意図したツリーの深さはありません。 (あるいは、私はこれが同じであることを監督しましたか?いいえ、私はそう思いません。) – Scheff

関連する問題