进程子进程的递归命令

时间:2014-12-29 21:46:47

标签: c recursion tree fork wait

我的代码:

int i, pid;

int mainPid = getpid();

for(i = 0; i < atoi(argv[1]); i++) {
    pid = fork();
    if(pid < 0) {
        printf("Error");
        exit(1);
    } else if (pid == 0) {
        printf("Child (%d): %d\n", i + 1, getpid());
        sleep(1);
        //SOME RECURSIVE FUNCTION FOR CHILD
        exit(0); 
    }
}


if(fork() == 0) {

    char a[100];
    sprintf(a, "%d", mainPid);
    execlp("pstree", "pstree", "-c", a, NULL);

}else { 
    sleep(1); 
}    

和参数为8时得到的输出是:

Child (2): 3031
Child (7): 3036
Child (6): 3035
Child (1): 3030
Child (5): 3034
Child (8): 3037
Child (4): 3033
Child (3): 3032
t1─┬─pstree
   ├─t1
   ├─t1
   ├─t1
   ├─t1
   ├─t1
   ├─t1
   ├─t1
   └─t1
很明显,孩子不是数字顺序,因为有些孩子出生在别人面前。

所以我的问题是,有没有办法强制按数字顺序,因为我想要调用某种递归函数,它会从stdin中读取一个数字并从第一个子进程中生成那么多子进程然后读取一个来自stdin的更多数字,并让很多来自第二个孩子的孩子等等...基本上最后,我想通过主流程调用pstree得到类似的东西:

   t1─┬─pstree
      ├─t1┬─t1
      |   └─t1
      ├─t1┬─t1─t1
      |   └─t1
      ├─t1
      ├─t1
      ├─t1─t1 
      └─t1

1 个答案:

答案 0 :(得分:1)

这是一个相当古老的问题,我仍然很乐意回答:

我稍微调整了你的print语句,如下所示

for(i = 0; i < atoi(argv[1]); i++) {
    pid = fork();
    if(pid < 0) {
        printf("Error");
        exit(1);
    } else if (pid == 0) {
        //printf("Child (%d): %d\n", i + 1, getpid());
        sleep(1);
        //SOME RECURSIVE FUNCTION FOR CHILD
        exit(0);
    } else {
        printf("Child (%d): %d\n", i + 1, pid);
    }
}

if(!(fork() == 0)) {

    char a[100];
    sprintf(a, "%d", mainPid);
    execlp("pstree", "pstree", "-c", a, NULL);

}else {
    sleep(1);
}

我得到你的期望(我相信):

Child (1): 10238
Child (2): 10239
Child (3): 10240
Child (4): 10241
Child (5): 10242
Child (6): 10243
Child (7): 10244
Child (8): 10245
pstree─┬─a.out
       ├─a.out
       ├─a.out
       ├─a.out
       ├─a.out
       ├─a.out
       ├─a.out
       ├─a.out
       └─a.out

如果这不符合您的预期,请告诉我。另外,如果你已经修好了,怎么样? :)