0
你好,我需要一些幫助。經過許多小時的研究和研究,我放棄了,我無法做到。我是內核編程的新手,我有這個任務。我被要求修改exit()系統調用代碼,以便它終止調用進程的所有子進程,然後終止進程。 盡我所知,exit()系統調用在子進程結束後給孩子們init進程。我以爲我可以用孩子的ID,並呼籲終止每個孩子:修改exit.c系統調用代碼
kill (child_pid, SIGTERM);
我也知道,我們可以訪問使用當前全局變量的task_struct調用進程。 任何人都知道我可以從當前變量中獲得所有的兒童PID嗎?還有其他解決方案嗎?
更新: 我找到了一種如何遍歷當前進程的子節點的方法。這是我修改後的代碼。
void do_exit(long code)
{
struct task_struct *tsk = current;
//code added by me
int nice=current->static_prio-120;
if(tsk->myFlag==1 && nice>10){
struct task_struct *task;
struct list_head *list;
list_for_each(list, ¤t->children) {
task = list_entry(list, struct task_struct, sibling);
//kill child
kill(task->pid,SIGKILL);
}
}
這是否會工作?
我沒有得到它可以得到更清楚嗎?我更新了我的問題,我發現了一種如何遍歷孩子的方法,但是這樣做會有用嗎? –
我相信練習的重點是你閱讀實際的代碼(如我提到的樣本),並從那裏學習,而不是使用谷歌搜索樣本沒有適當的上下文。特別是,你添加的循環是錯誤的,因爲它不鎖定tasklist_lock或其他任何保證列表穩定性的東西。使用kill(task-> pid,..)你可以使用pid,並讓func根據pid查找任務結構。你從pid中獲取的任務結構。再次閱讀代碼。 –
這並沒有回答我的問題。不要給我一個提示。我已經有了我需要的所有提示,但我無法意識到大局。有人可以向我展示給我,而我也有相同的時間? –