2012-03-11 8 views
4

私が書いている/procユーティリティ(すべてのプロセスをループしています)(/fs/procのカーネルモジュール)。問題は、私はルートネームスペース内のプロセスだけを見ていることです。私はsched.hからfor_each_processマクロを使用しようとしています。なぜfor_each_processはすべてのタスクを表示しないのですか?

シェルにpsと入力すると、プロセスがたくさん表示されますが、for_each_processループには表示されません。何がありますか?

注:rcu_read_lockと関係がありますか?私はrcu_read_lockを置くことを恐れ、どこに行かなければならないのか分からない。問題は、documentation私はプリエンプティブカーネル(私は)であると言っているようだ、それはrcu_read_lockの中で眠ることは違法です。私はdown_read(mmap_sem)に電話する必要があります。だから私はrcu_read_lockを使うことができないのですか?

+0

これは許可の対象になる可能性がありますか? su/sudoでユーティリティを実行するとどうなりますか?私はこれがCプログラムだと思っていますか? –

+0

この例も同様の結果を示しているようです:http://tuxthink.blogspot.com/2011/03/using-foreachprocess-in-proc-entry.html –

+0

私の最初を無視し、これがカーネルモジュールであることを認識しませんでした。 –

答えて

4

すべてのプロセスを表示する必要があります。私はこのようなコードを書いています。

struct task_struct *task; 

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

これはすべてのプロセスを印刷しています。私はあなたのproc_read機能を疑う。 proc_read機能をここに貼り付けることはできますか?

+0

マルチコアでも同様に動作しますか? – cph2117

-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 
+0

これは良いことですが、もし/ procを列挙しようとしているのであれば、おそらくユーザランドプロセスを無視したい理由がありますか?とにかく推測すると、ロバートはもう少し説明したいかもしれません。 –

+0

私はprocに存在するモジュールを書いています。つまり、 'cat/proc/list_of_procs'でアクセスします。カーネルレイヤーの機能が必要です。 –

+0

私の悪い、それは実際に興味深いものです... – jjm

3

をカウントしていないと思いましたリーダー。

task_structすべての変数(sched.hで定義されています)を繰り返し処理します。

struct task_struct *g, *p; 
do_each_thread(g, p) { 
    //do something with p 
} while_each_thread(g, p); 
関連する問題