如何在代码中添加计数器,以便能够计算每个进程的位置。现在我得到以下输出:
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);
}
答案 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。