如何计算fork进程的位置

时间:2015-11-19 12:49:07

标签: c linux fork

如何在代码中添加计数器,以便能够计算每个进程的位置。现在我得到以下输出:

Process Pid: 6179 PPid: 4378 (position: ?).
Process Pid: 6181 PPid: 6179 (position: ?).
Process Pid: 6180 PPid: 6179 (position: ?).
Process Pid: 6185 PPid: 6180 (position: ?).
Process Pid: 6183 PPid: 6181 (position: ?).
Process Pid: 6182 PPid: 6181 (position: ?).
Process Pid: 6184 PPid: 6180 (position: ?).

我想要的就是能够在树中输出Pid位置:

Process Pid: 6179 PPid: 4378 (position: 1).
Process Pid: 6181 PPid: 6179 (position: 3).
Process Pid: 6180 PPid: 6179 (position: 2).
Process Pid: 6185 PPid: 6180 (position: 7).
Process Pid: 6183 PPid: 6181 (position: 5).
Process Pid: 6182 PPid: 6181 (position: 4).
Process Pid: 6184 PPid: 6180 (position: 6).

谢谢

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

/*Childs to be created*/
#define NUM_CHILDS 2  

/*Child launcher*/
void launchChild(int nivel,int n){

printf("Process Pid: %d PPid: %d (position: ?).\n",getpid(),getppid(),n); 

if(nivel<NUM_CHILDS){
    int process;    
    process = fork(); /*Child or parent?*/

    if(process!=0){ /*We are parent*/
        process=fork();

        if(process==0){ /*We are child*/
            launchChild(nivel+1,n);
        }
    }
    else{ /*We are parent*/
        launchChild(nivel+1,n);
    }
}
wait(NULL);
}

int main(void){
launchChild(0,1);
}

2 个答案:

答案 0 :(得分:1)

这并不容易。主要原因是您的fork模式生成了一个进程树。树中的编号节点并不明显。最糟糕的是,fork引入了并发性,然后你无法真正控制进程运行的顺序。

答案 1 :(得分:1)

分叉进程拥有其父级的所有信息直至其产生。这意味着分叉进程知道父进程的“位置”。程序员进一步了解了生成机制。说,你总是分叉两个孩子,深度为3:

       0
   1       2
 3   4   5   6
7 8 9 A B C D E

孩子0xA = 10知道它是正确的孩子,深度为3,其父亲是4:

own_position = (i_am_right_child ? 1 : 0) +                  // nth child under parent
               2 * (parent_id - (2**(own_depth - 1) - 1)) +  // 2 * offset of parent in its line
               2**own_depth - 1                              // first index of own line

10 = 1 + 2 * (4 - 2**(3 - 1) + 1) + 2**3 - 1

如果您分叉两个以上的孩子,那么也尝试更改公式中的2。

不同的编号系统是可能的。这里称为breadth-first search