我需要在C中实现一个可以模拟pstree的递归函数,也就是说,将下面的数字想象为一个过程:
<eos>
等....
1 (father)
2 (child of 1)
3 (child of 1)
4 (son of 3)
5 (child of 4)
6 (child of 3)
但它只打印父级(称为递归函数)和相同的子级,没有其他子级。 我知道另一个对递归函数的调用在前一个孩子的父母中丢失了,但是如何?
完整代码:
void imprime_Pstree(int i, int ntabs)
{
int k = 0, j = 0, quantProc = 0;
int procAtual;
// Prints the number of tabs
for(k = 0; k < ntabs; k++)
printf("\t");
quantProc = preenche_vetor(i);
// Prints the process name
imprimeNomeProcesso(i);
for(j = 0; j < quantProc; j++) {
imprime_Pstree(processos[j], ntabs+1);
}
}
答案 0 :(得分:0)
processos
是一个全局变量,包含i的所有子节点的列表。这在递归函数中不起作用。递归调用将覆盖该数组。您必须将其设为局部变量并将其传递给必须赋值的函数:
void imprime_Pstree(int i, int ntabs)
{
int k = 0, j = 0, quantProc = 0;
int procAtual;
int processos[1000]; // <-- have a local array
// Imprime a quantidade de tabs
for(k = 0; k < ntabs; k++)
printf("\t");
// pass that array to preenche_vetor()
quantProc = preenche_vetor(i, processos );
// Imprime o nome do processo
imprimeNomeProcesso(i);
for(j = 0; j < quantProc; j++) {
imprime_Pstree(processos[j], ntabs+1);
}
}
当然你还必须更改preenche_vetor()的签名,并且必须在那里进行初始化()。
修改强> 正如@Aconcagua建议的那样,首先确定孩子的数量然后宣布并填写VLA会更好
答案 1 :(得分:0)
quantProc = preenche_vetor(i);
好吧,现在我们有很多流程。
for(j = 0; j < quantProc; j++)
{
imprime_Pstree(processos[j], ntabs+1);
}
两种可能的情况:
processos
包含系统中当前所有活动进程的列表。然后你就像在数组中找到它们一样迭代这些进程,i。即如果任何进程至少有一个子进程,那么系统中的第一个进程(linux:将是id为0的root进程,通常永远不会死)将始终作为当前进程的子进程打印。您需要一个单独的列表,其中包含您可以迭代的子进程ID!
processos
由preenche_vetor
函数填充给定进程ID的子进程。然后,对imprime_Pstree
的任何递归调用都将覆盖被调用者的子进程列表(再次调用preenche_vetor
)。解决方案:您需要为每个递归调用提供单独的数组。