2

カーネル空間で作業していて、アプリケーションがいつ停止またはクラッシュしたかを知りたいです。ioctl 呼び出しを受け取ると、アプリケーションのプロセスに関する多くの情報がある構造体 task_struct を取得できます。私の問題は、プロセスがまだ生きているかどうかを定期的にチェックして、プロセスが強制終了されたときに非同期呼び出しを行うことです。

私のテスト環境は QEMU 上にあり、しばらくしてアプリケーションでシステム ("kill -9 pid ") を実行しました。一方、カーネルでは、次のように task_struct を定期的にチェックしました
。/* -1 実行不可、0 実行可能、>0 停止 */
static inline int pid_alive(struct task_struct *p)

問題は、私の task_struct ポインターが変更されていないように見えることです。通常、各プロセスには task_struct があり、もちろんプロセスの状態に対応しています。そうでなければ、「揮発性の長い状態」のポイントがわかりません

私は何が欠けていますか?私が QEMU でテストしているのは、100 の msleep で while(1) で task_struct をチェックすることをテストしたことですか? どんな助けでも大歓迎です。

アプリがモジュール ("/dev/driver") のファイル記述子を閉じているときに、アプリケーションの pid を受け取ることができれば、部分的にはうれしいです。

ありがとう!

4

3 に答える 3

1

task_structポインターをハイブオフして後で参照することはできません。プロセスが強制終了された場合、ポインターは無効にtask_structなります。また、プロセスを参照するためにカーネル内で PID 値を使用しないでください。PID 値は再利用されるため、同じプロセスについて話しているとは言えません。

ドライバーは.releaseコールバックを提供できます。これは、プロセスが終了または強制終了された場合を含め、ドライバー ファイルが閉じられたときに呼び出されます。currentこのコールバックからアクセスできます。プロセスがファイルを開いてフォークした場合、呼び出したプロセスと呼び出したプロセス.releaseが異なる可能性があることに注意してください.open。ドライバーはこれを処理できる必要があります。

于 2013-07-23T04:14:49.673 に答える