使用C中的分叉制作树结构

时间:2014-03-05 23:03:17

标签: c tree fork

我被困在这几天了。我必须使用fork()函数编写以下树结构。有什么建议?这就是我到目前为止所做的:

代码:

   #include <stdio.h>
   #include <stdlib.h>
   main ()
   {
  int pid;
  pid = fork();
  //Child
  if (pid == 0){
  if ((pid = fork()) == 0)
  {
  printf("GrandChild: child pid = % d, my pid = %d, parent pid = %d \n",
                      pid, getpid(), getppid());
  }
  }
  exit(0); }

树形结构:

         A
   B           C
D            E   F

1 个答案:

答案 0 :(得分:0)

以下代码应该创建您想要的树结构。每个进程分叉其子代,运行一些所需的代码,然后等待任何/所有子进程完成运行:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define printPID printf("my pid = %d, parent pid = %d\n", getpid(), getppid());

void fork_error() {
  perror("Failed to fork.");
  exit(1);
}

void fork_child(void (*f)()) {
  int pid;
  if ((pid = fork()) == 0) {
    f();
    wait(NULL);
    exit(0);
  } else if (pid < 0) {
    fork_error();
  }
}

/* Function prototypes */
void A(), B(), C(), D(), E(), F();

void A() {
  fork_child(B);
  fork_child(C);
  /* Code for A goes here */
  printPID;
  wait(NULL);
}

void E() {
  /* Code for E goes here */
  printPID;
}

void F() {
  /* Code for F goes here */
  printPID;
}

void C() {
  fork_child(E);
  fork_child(F);
  /* Code for C goes here */
  printPID;
}

void D() {
  /* Code for D goes here */
  printPID;
}

void B() {
  fork_child(D);
  /* Code for B goes here */
  printPID;
}

int main(int argc, char *argv[]) {
  A();
  return 0;
}

示例输出:

$ ./a.out
my pid = 17365, parent pid = 14178
my pid = 17366, parent pid = 17365
my pid = 17369, parent pid = 17367
my pid = 17368, parent pid = 17366
my pid = 17367, parent pid = 17365
my pid = 17370, parent pid = 17367

如果在每个节点/进程中也需要子PID,则fork_child()返回一个包含子PID的int。