我试图循环通过/proc
实用程序中的每一个进程,我正在写(内核模块在/fs/proc
)。 问题是,我只看到根名称空间中的进程。 我试图从sched.h
使用macrosfor_each_process
。
我可以在shell中键入ps
并查看大量进程,但我的for_each_process
循环没有看到它们。 是什么赋予了?
注意:我想知道它是否与rcu_read_lock
? 我害怕把一个rcu_read_lock
,我不知道它应该去哪里。 麻烦的是,我所阅读的文档似乎说,在一个可抢占的内核(我的是),睡在rcu_read_lock
内是非法的。 我需要调用down_read(mmap_sem)
,我恐怕会睡觉。 那意味着我不能使用rcu_read_lock
?
它应该显示你所有的过程。 我已经写了这样的代码。
struct task_struct *task; for_each_process(p) { printk("Task %s (pid = %d)\n",p->comm, task_pid_nr(p)); }
这是打印所有的过程。 我怀疑你的proc_read
函数。 你可以在这里粘贴你的proc_read
函数吗?
我认为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);
这个例子打印出一个很长的列表,看起来好像它可能正在打印几乎所有的人……以为我没有把它们计算在内
http://tuxthink.blogspot.in/2011/03/using-foreachprocess-in-proc-entry.html
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