如何从内核模块(Linux)中挂起任务?

时间:2012-10-27 17:41:14

标签: c linux kernel

我有一个Linux内核模块,每10秒运行一次,并扫描是否有任何资源占用过程。然后我需要将它们暂停一分钟(即通过代码的六个循环),然后让它们再次运行。我已经编写了代码来检查条件,并拥有所有相应的task_struct指针。

问题是,如果给出task_struct指针,我该如何暂停任务?之后,我该如何恢复这项任务?

3 个答案:

答案 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。

相关问题