我有一個Linux內核模塊,每10秒運行一次,並掃描是否有任何資源佔用過程。然後我需要暫停一分鐘(即通過代碼的六個循環),然後讓它們再次運行。我已經編寫了代碼來檢查條件,並具有所有適當的task_struct指針。如何暫停內核模塊(Linux)中的任務?
問題是,我該如何暫停任務,因爲它的task_struct指針?之後,我該如何恢復該任務?
我有一個Linux內核模塊,每10秒運行一次,並掃描是否有任何資源佔用過程。然後我需要暫停一分鐘(即通過代碼的六個循環),然後讓它們再次運行。我已經編寫了代碼來檢查條件,並具有所有適當的task_struct指針。如何暫停內核模塊(Linux)中的任務?
問題是,我該如何暫停任務,因爲它的task_struct指針?之後,我該如何恢復該任務?
您可以通過發送STOP
信號來暫停進程,然後通過發送CONT
信號來恢復進程;例如,可能通過kill_pid(task_pid(task_struct), SIGSTOP, 1)
和kill_pid(task_pid(task_struct), SIGCONT, 1)
。
該方法並不完美。例如,另一個進程可以通過發送CONT
信號來使這個進程繼續運行,除非您在超時期間還阻止CONT
信號。
也許,您可以將任務從運行隊列中刪除,將其保存在某處並稍後放回。
另一種方法可能會降低其優先級。雖然這並不妨礙它的運行,但它會阻止它壟斷CPU。
您可以給我一個提示,告訴我如何完成第一件事:從運行隊列中刪除任務。我搜尋sched.h的功能,但我似乎無法找到它。謝謝:) – bladerunner1992
我不會搞亂運行隊列。相反,請添加可從調度程序訪問的每進程標誌,並且不要調度具有該標誌集的進程。 –
@ bladerunner1992在'kernel/sched/core.c'中查找'deactivate_task()'和'activate_task()'。我自己並沒有這樣做,但如果它們沒有導出,我會嘗試使用這些函數或副本。也許把'state'設置爲'TASK_STOPPED'也可以。 –
如果您有task_struct,則從內核發送SIGSTOP
,使用send_sig。然後發送SIGCONT
恢復它。進程不能忽略SIGSTOP
(或SIGKILL
)。
或嘗試send_signal並使用SEND_SIG_FORCED
作爲siginfo。
我會盡力,謝謝。我是否必須爲task_struct獲取鎖,或者是send_sig是否安全? – bladerunner1992
看起來像它鎖定了你,至少在最近的內核http://lxr.linux.no/linux+v3.6.3/kernel/signal.c#L1212 – engineerC
我設法阻止進程使用'send_sig( SIGSTOP,p,0);',其中p是指向'task_struct'的指針,但似乎進程不響應'send_sig(SIGSTOP,p,0);'。調用中是否存在某些我做錯的事情? – bladerunner1992
你所描述的可能是在用戶空間中比在內核中做得更好。 – duskwuff
這是一個家庭作業問題,這就是爲什麼它是人爲的。 作業政策不允許向我以外的任何人求助。如果在這篇文章中有任何真正的詢問者發生,我應該注意到我的學生有一箇舊的和稍微修補過的內核,它暴露了一些或兩個隱藏在最近的內核中的內核函數。 –