私は間違いなくこのテーマの専門家ではありませんが、前学期にプロセスのスナップショットを撮る必要があったときに、非常に似たようなことをしました。残念ながら、この方法ではカーネルを掘り下げる必要がありますが、これはおそらくやりたいことではありません。
この記事は役に立ちました。
とにかく、ここにいくつかのスニペットがあります。
write_lock_irq(&tasklist_lock);
for_each_process(task) {
if (system_or_user == 0)
print_mem_user(task);
if (system_or_user == 1)
print_mem_system(task);
}
write_unlock_irq(&tasklist_lock);
いくつかのデータ構造をロックダウンする必要があるか、カーネルがハングすることがあります。「for_each_process」はどこかで定義されたマクロですが、どのように機能するか覚えていません D:
static void print_mem_system(struct task_struct *task)
{
struct mm_struct *mm;
if (task -> mm == NULL){ // this is how you distinguish system processes from user processes
myarraypid[totalnumberofprocesses] = task -> pid; // store process id's into myarraypid[], which you can later copy back to user space for printing/display. Additional information would be found in a "task_struct" which is Linux's implementation of a process.
}
}
クラスメートの何人かは、異なるアプローチを取り、"ps" ユーティリティのソースに飛び込みました。Linux 2.6.18-92.1.13.e15 で作業していたと思います。免責事項:これは私にとってはうまくいきましたが、マイレージは異なる場合があります. 私は壁から外れている可能性が非常に高く、あなたを間違った方向に導きたくありません.