所以我想在 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;
}
錯誤如下所示: 
uj5u.com熱心網友回復:
您正在撰寫 Minix 內核代碼。 Minix 內核堆疊為 4096 位元組。 任何重要的遞回都可能使其溢位,這可能是頁面錯誤的原因。請注意,錯誤地址靠近頁面末尾,可能是堆疊頁面下方的下一個頁面,這可能是未映射的保護頁面,因此堆疊溢位會在破壞其他資料之前發生混亂。
所以你需要想出一個不使用遞回的演算法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362919.html
