Я определенно не эксперт по этому вопросу, но я сделал нечто очень похожее для задания в прошлом семестре, когда мы должны были сделать снимки процессов. К сожалению, этот метод требует копаться в ядре, что, вероятно, не то, что вы хотите сделать.
Я нашел эту статью полезной.
В любом случае, вот некоторые фрагменты.
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. Отказ от ответственности: это сработало для меня, но ваш пробег может отличаться. Я вполне могу быть вне стены, и я не хочу вести вас в неправильном направлении.