所以我想用c写一个递归的syscall,它可以从一个进程中得到所有的后代(孩子,孙子,...)。我使用的系统是Minix 3.2.1,但是我认为它应该和大多数UNIX系统没有太大的不同。但是我的函数抛出了一个非常难看的错误。代码如下:
int do_whoMaxDescendants(void)
{
int maxChildren = 0;
pid_t found = -1;
for (int proc_nr = 0; proc_nr < NR_PROCS; ++proc_nr)
{
if (mproc[proc_nr].mp_flags & IN_USE)
{
int children = kidCount(proc_nr);
if (children > maxChildren)
{
maxChildren = children;
found = mproc[proc_nr].mp_pid;
}
}
}
return found;
}
int kidCount(int currParent)
{
int children = 0;
for (int nextParent = 0; nextParent < NR_PROCS; ++nextParent)
{
if ((mproc[nextParent].mp_flags & IN_USE) && (mproc[nextParent].mp_parent == currParent))
{
children++;
children = kidCount(nextParent) + children;
}
}
return children;
}
错误如下所示:
2条答案
按热度按时间mklgxw1f1#
您正在编写Minix内核代码。Minix内核堆栈是4096字节。任何重要的递归都可能使其溢出,这可能是导致页面错误的原因。请注意,出错的地址接近页面的末尾,可能是堆栈页下面的下一页,它可能是未Map的保护页,因此堆栈溢出在破坏其他数据之前就发生了混乱。
所以你需要想出一个不使用递归的算法。
o2gm4chl2#
[编辑]对于将来的生成,例如进程INIT是它自己的父进程,因此在INIT上调用kidCount会触发无限循环。您必须在KidCount中的if中添加额外的语句,例如(process_ID!= Parent_process_ID)