2012-03-11 51 views
4

我正在嘗試循環遍歷我編寫的一個/proc實用程序中的每個進程(/fs/proc中的一個內核模塊)。問題是,我只看到根名稱空間中的進程。我正嘗試使用sched.h中的宏for_each_process爲什麼沒有for_each_process顯示每個任務?

我可以在shell中輸入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程序? – 2012-03-11 03:18:10

+0

也似乎這個例子是顯示類似的結果:http://tuxthink.blogspot.com/2011/03/using-foreachprocess-in-proc-entry.html – 2012-03-11 03:23:21

+0

忽略我的第一個,沒有意識到這是一個內核模塊。 – 2012-03-11 03:38:10

回答

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 2016-11-08 17:59:06

-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,那麼您可能有理由忽略用戶級進程?無論如何,羅伯特可能想更多地解釋一下。 – 2012-03-11 03:30:47

+0

我正在編寫一個模塊,它將生存在proc中,即我可以通過'cat/proc/list_of_procs'訪問它。所以我需要一個內核層功能。 – 2012-03-11 03:36:51

+0

我的不好,這實際上是有趣的... – jjm 2012-03-11 03:52:55

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); 
相關問題