Почему for_each_process не показывает каждую задачу? - PullRequest
4 голосов
/ 11 марта 2012

Я пытаюсь перебрать все процессы в /proc утилите, которую я пишу (модуль ядра в /fs/proc). Проблема в том, что я вижу только процессы в корневом пространстве имен. Я пытаюсь использовать макрос for_each_process из sched.h.

Я могу набрать ps в оболочке и увидеть множество процессов, но мой цикл for_each_process их не видит. Что дает?

Примечание: Интересно, это как-то связано с rcu_read_lock? Я боюсь поставить rcu_read_lock, и я не знаю, куда это должно пойти. Проблема в том, что документация , которую я прочитал, кажется, говорит, что в вытесняемом ядре (моё есть) запрещено спать внутри rcu_read_lock. Мне нужно позвонить down_read(mmap_sem), который, боюсь, будет спать. Значит, я не могу использовать rcu_read_lock?

Ответы [ 4 ]

5 голосов
/ 12 марта 2012

Он должен показать вам все процессы.Я написал такой код.

struct task_struct *task;

for_each_process(p) {
    printk("Task %s (pid = %d)\n",p->comm, task_pid_nr(p));
}

Это печать всех процессов.Я подозреваю, что ваша proc_read функция.Можете ли вы вставить сюда свою proc_read функцию?

3 голосов
/ 30 июня 2012

Я думаю, for_each_process() просто дает вам лидера группы потоков.

Это перебирает все task_struct переменные (определенные в sched.h).

struct task_struct *g, *p;
do_each_thread(g, p) {
    //do something with p
} while_each_thread(g, p);
0 голосов
/ 12 марта 2012

В этом примере распечатывается длинный список, похоже, что он может печатать почти все из них ... хотя я их не учел

http://tuxthink.blogspot.in/2011/03/using-foreachprocess-in-proc-entry.html

0 голосов
/ 11 марта 2012

for_each_process - функция уровня ядра, и на самом деле это не то, как вы должны зацикливать процессы в unix.Кое-что намного более простое, такое как это (python, легко осуществляемый на других языках), могло бы быть решением, которое Вы хотите.

#Print each process id
import re,os
for fn in os.listdir( '/proc' ):
    if re.match('\d+', fn):
        print 'process %s'%fn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...