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