unix 这个c递归函数生成这个页面错误有什么原因吗?

ni65a41a  于 2022-11-23  发布在  Unix
关注(0)|答案(2)|浏览(100)

所以我想用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;
}

错误如下所示:

mklgxw1f

mklgxw1f1#

您正在编写Minix内核代码。Minix内核堆栈是4096字节。任何重要的递归都可能使其溢出,这可能是导致页面错误的原因。请注意,出错的地址接近页面的末尾,可能是堆栈页下面的下一页,它可能是未Map的保护页,因此堆栈溢出在破坏其他数据之前就发生了混乱。
所以你需要想出一个不使用递归的算法。

o2gm4chl

o2gm4chl2#

[编辑]对于将来的生成,例如进程INIT是它自己的父进程,因此在INIT上调用kidCount会触发无限循环。您必须在KidCount中的if中添加额外的语句,例如(process_ID!= Parent_process_ID)

相关问题