这个 c 递归函数是否有任何原因产生这个页面错误?
Is there any reason this c recursive function generates this pagefault?
所以我想用 c 编写递归系统调用,它从进程(孩子、孙子、..)中获取所有后代。我使用的系统是 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;
}
错误如下所示:
您正在编写 Minix 内核代码。 The Minix kernel stack is 4096 bytes. 任何重要的递归都可能溢出它,这可能是页面错误的原因。请注意,错误地址接近页面末尾,可能是堆栈页面下方的下一页,它可能是未映射的保护页面,因此堆栈溢出会在损坏其他数据之前发生恐慌。
所以你需要想出一个不使用递归的算法。
所以我想用 c 编写递归系统调用,它从进程(孩子、孙子、..)中获取所有后代。我使用的系统是 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;
}
错误如下所示:
您正在编写 Minix 内核代码。 The Minix kernel stack is 4096 bytes. 任何重要的递归都可能溢出它,这可能是页面错误的原因。请注意,错误地址接近页面末尾,可能是堆栈页面下方的下一页,它可能是未映射的保护页面,因此堆栈溢出会在损坏其他数据之前发生恐慌。
所以你需要想出一个不使用递归的算法。