我有一个Linux内核模块,每10秒运行一次,并扫描是否有任何资源占用过程。然后我需要将它们暂停一分钟(即通过代码的六个循环),然后让它们再次运行。我已经编写了代码来检查条件,并拥有所有相应的task_struct指针。
问题是,如果给出task_struct指针,我该如何暂停任务?之后,我该如何恢复这项任务?
答案 0 :(得分:3)
您可以通过发送STOP
信号暂停该过程,然后通过发送CONT
信号恢复该过程;例如,可以通过kill_pid(task_pid(task_struct), SIGSTOP, 1)
和kill_pid(task_pid(task_struct), SIGCONT, 1)
。
这种做法并不完美。例如,除非您在超时期间阻止CONT
信号,否则另一个进程可以通过发送CONT
信号来保持此过程的运行。
答案 1 :(得分:2)
如果您有task_struct,则使用send_sig从内核中发送SIGSTOP
。然后发送SIGCONT
以恢复它。流程不能忽略SIGSTOP
(或SIGKILL
)。
或者尝试send_signal并使用SEND_SIG_FORCED
作为siginfo。
答案 2 :(得分:0)
也许,您可以从运行队列中删除任务,将其保存在某处并稍后将其放回。
另一种方法可能是降低其优先级。虽然这不会阻止它运行,但它会阻止它独占cpu。