如何使用fork()从子进程创建子进程?

时间:2016-12-03 14:16:02

标签: c fork response pid

我想用fork()创建一个子(1),这个儿子需要创建另一个子(2)。

儿子(1)和父亲需要等待他们儿子的结局给出一个信息。我希望他们所有人都printf他们的PID。

这是我的代码:

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

int main(){

  int pid; //i know thats not good

  if((pid = fork ()) == 0) { //this isnt good either
    printf ("SON %d\n",getpid());

  } else {
    // sleep(1) not necessary
    printf ("Thats the Father\n");
    printf ("PID of my Son PID %d\n",pid);
  }
}

找到几个信息来创建1个父亲中的多个孩子,但我不知道,如何从孩子身上创建一个新孩子。

2 个答案:

答案 0 :(得分:1)

  

找到几个信息从1个父亲中创建多个孩子,但我不知道,如何从孩子身上创建一个新孩子。

它与您创建第一个子进程的方式完全一样。您需要在子进程中再次fork()来创建另一个进程。使用wait(2)等待子进程。

考虑一下这个例子(没有错误检查):

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void){

pid_t pid;

if((pid = fork()) == 0) {
    printf ("Child process: %d\n", (int)getpid());
    pid_t pid2;

    if ((pid2 = fork()) == 0) {
        printf("Child's child process: %d\n", (int)getpid());
    } else {
        int st2;
        wait(&st2);
    }
} else {
    printf ("Parent process: %d\n", (int)getpid());
    int st;
    wait(&st);
}

return 0;
}

答案 1 :(得分:0)

感谢您的好评。知道了。

我的实际代码:

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

int main(void){

int pid;
int pid2;
int st;
int st2;

if((pid = fork()) == 0) {
    printf ("Kind: %d\n",getpid());

    if ((pid2 = fork()) == 0) {
        printf("Kindes Kind process: %d\n",getpid());
    } else {
                wait(&st2);

    }
} else {
    printf("Ich warte auf meinen Sohn\n"); //WAITING FOR MY SON
    wait(&st);
    printf("mein Sohn ist fertig\n"); // MY SON IS RDY
        printf ("Vater process: %d\n", getpid());
    printf("Vater: Status = %d\n",st); //MY STATUS AS A FATHER
}

return 0;
}

我的结果:

Ich warte auf meinen Sohn //waiting for my son
Kind: 2175 //pid children
Kindes Kind process: 2176 // childrens child pid
mein Sohn ist fertig //my son finished
Vater process: 2174 //father pid
Vater: Status = 0 //father status

我唯一的问题是,第一个孩子的PID首先打印出来。 我希望孩子等他自己的孩子和打印出他自己的pid。

像:

waiting for my Son(2)
pidchild2
my son2 finished
status
waiting for my son
pidchild1
my son1 finished
father pid
status

编辑:

得到它,我想

只需要在wait2之外的printf。很明显

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

int main(void){

int pid;
int pid2;
int st;
int st2;

if((pid = fork()) == 0) {


    if ((pid2 = fork()) == 0) {
        printf("Kindes Kind process: %d\n",getpid());
    } else {
  printf("Ich warte auf meinen Sohn1\n");
                wait(&st2);
  printf("mein Sohn ist fertig2\n"); // MY SON IS RDY
  printf ("Kind: %d\n",getpid());
  printf("Sohn1: Status = %d\n",st2); //MY STATUS AS A FATHER

    }
} else {
    printf("Ich warte auf meinen Sohn\n"); //WAITING FOR MY SON
    wait(&st);
    printf("mein Sohn ist fertig\n"); // MY SON IS RDY
        printf ("Vater process: %d\n", getpid());
    printf("Vater: Status = %d\n",st); //MY STATUS AS A FATHER
}

return 0;
}