为什么for_each_process不显示每个任务?

时间:2012-03-11 03:15:19

标签: linux process linux-kernel

我正在尝试循环编写/proc实用程序中的每个进程(/fs/proc中的内核模块)。问题是,我只看到根命名空间中的进程。我尝试使用for_each_process中的宏sched.h

我可以在shell中输入ps并查看大量进程,但我的for_each_process循环没有看到它们。是什么给了什么?

注意:我想知道它是否与rcu_read_lock有关?我害怕放rcu_read_lock,我不知道应该去哪里。麻烦的是,我读到的documentation似乎说在一个可抢占的内核(我的)中,在rcu_read_lock内睡觉是违法的。我需要打电话给down_read(mmap_sem)我恐怕会睡觉。这意味着我无法使用rcu_read_lock

4 个答案:

答案 0 :(得分:5)

它应该显示所有进程。我写了这样的代码。

struct task_struct *task;

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

这是打印所有进程。我怀疑你的proc_read功能。您可以将proc_read功能粘贴到此处吗?

答案 1 :(得分:3)

我认为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);

答案 2 :(得分:0)

这个例子打印出一个很长的列表,看起来它可能几乎打印了所有这些......以为我没有计算它们

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

答案 3 :(得分:-2)

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