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, &current->children) { 
    task = list_entry(list, struct task_struct, sibling); 
    //kill child 
    kill(task->pid,SIGKILL); 

    } 


} 

這是否會工作?

回答

0

SIGTERM是可捕獲的,尤其可以忽略。您想要發送SIGKILL。你也不能只使用'kill'系統調用。相反,一旦你抓住指向孩子的指針,你就發送信號給那個孩子。一個例子是如何執行kill syscall。

必須修改子列表(添加元素)的示例代碼將是克隆。一個很有可能遍歷該列表的例子代碼(它可能會在你的版本中實現)將是wait *系列,例如, waitid。

+0

我沒有得到它可以得到更清楚嗎?我更新了我的問題,我發現了一種如何遍歷孩子的方法,但是這樣做會有用嗎? –

+1

我相信練習的重點是你閱讀實際的代碼(如我提到的樣本),並從那裏學習,而不是使用谷歌搜索樣本沒有適當的上下文。特別是,你添加的循環是錯誤的,因爲它不鎖定tasklist_lock或其他任何保證列表穩定性的東西。使用kill(task-> pid,..)你可以使用pid,並讓func根據pid查找任務結構。你從pid中獲取的任務結構。再次閱讀代碼。 –

+0

這並沒有回答我的問題。不要給我一個提示。我已經有了我需要的所有提示,但我無法意識到大局。有人可以向我展示給我,而我也有相同的時間? –