0

10秒ごとに実行され、リソースを大量に消費するプロセスがあるかどうかをスキャンするLinuxカーネルモジュールがあります。次に、それらを1分間一時停止し(つまり、コードを6回ループする)、後で再度実行する必要があります。条件をチェックするコードをすでに記述しており、適切なtask_structポインターをすべて持っています。

問題は、task_structポインターを指定して、タスクを一時停止するにはどうすればよいですか?そして後で、どうすればそのタスクを再開できますか?

4

3 に答える 3

3

シグナルを送信してプロセスを一時停止し、STOPシグナルを送信して再開することができCONTます。おそらく経由kill_pid(task_pid(task_struct), SIGSTOP, 1)してkill_pid(task_pid(task_struct), SIGCONT, 1)、例えば。

そのアプローチは完璧ではありません。たとえば、別のプロセスは、タイムアウト期間中にシグナルCONTをブロックしない限り、シグナルを送信することでそのようなプロセスを実行し続けることができます。CONT

于 2012-10-27T18:16:45.880 に答える
2

task_structがある場合は、send_sigSIGSTOPを使用してカーネル内から送信します。次に、送信して再開します。プロセスは無視できません(または)。SIGCONTSIGSTOPSIGKILL

または、send_signalを試して、 siginfoに使用SEND_SIG_FORCEDしてください。

于 2012-10-27T18:27:58.347 に答える
0

たぶん、実行キューからタスクを削除し、どこかに保存して、後で元に戻すことができます。

別の方法は、その優先順位を下げることです。これは実行を妨げるものではありませんが、CPUを独占することを防ぎます。

于 2012-10-27T18:24:30.737 に答える