我试图创建进程的二叉树结构,其中每个进程不超过2个子进程

时间:2017-02-18 09:16:07

标签: c++ operating-system

我试图为每个进程创建两个子进程(二叉树),如果n = 3,进程树结构应该像(1) - >(2),(1) - >(3),(2) ) - >(4),(2) - >(5)。我编写了一个程序,我可以为每个子进程创建2个进程和2个进程,但我想提供一个数字n = number并根据以二进制树格式传递的数字创建进程。     这是我的代码:

#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
我是个孩子3。我的pid是:40我的ppid是38
我是个孩子4。我的pid是:41我的ppid是37
我是小孩。我的pid是:42我的ppid是41
我是个孩子5。我的pid是:43我的ppid是41

1 个答案:

答案 0 :(得分:0)

我认为Raj理解fork()wait()但还没有得到二叉树的概念(以及如何使用递归函数实现它们)我做了一个小的完整样本这个。它阻止了fork()的使用,使二叉树/递归概念更加清晰。

完全放弃:

#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;
}

我在cygwin上使用gcc编译并测试了这个:

$ 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)