我正在尝试循环编写/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
?
答案 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