2011-11-19 30 views
5

我可以在procfs中創建任何文件映射來反映我的程序的內部狀態嗎?將程序狀態導出到procfs?

例如,

main.c: 

char *message; 

... 

假設PID是1200,是有可能創造一個瞬態文件/ proc/1200 /變量/消息時,其將反映該消息變量?

我想我需要使用proc fs,因爲/proc/.../{net,f​​d,task等},我應該從哪裏開始,如果我想添加另一個變量/節proc fs?

回答

4

有沒有工具來完成你想要完成的任務。

有一些事情是接近 - gdb(1)知道如何反思被一些變量(不是所有變量的運行和顯示值的程序編制生存 - 儘管調試-g標誌幫助gdb(1)發現什麼優化可以有完成你的程序)。

FUSE項目使得用戶空間程序可以通過內核爲其他進程提供文件系統。您可以直接使用FUSE從程序中導出選定的變量,也可以嘗試一些更加雄心勃勃的工具,並使用FUSE的發佈功能封裝gdb(1)的內省功能,併爲全球提供此項服務。

您也可以從程序中使用9p進行研究 - 它與FUSE的精神類似,允許程序通過文件系統接口爲其功能提供接口。 (您可以在wmii window manager中看到它的使用,其中可以通過文件系統接口對窗口管理器進行令人驚訝的控制量,從而可以使用任何您喜歡的語言輕鬆進行編程。)您可以再次將此與gdb(1)的內省嘗試提供此功能的能力。

我希望這樣的項目能夠配得上一個高級項目或畢業生項目 - 而不是很快就能完成的事情。

3

一般來說,你不能僅僅從用戶空間來做。 procfs是內核向您報告其進程狀態的內核。所以,如果你想要做這樣的事情,你會

a)必須創建一個內核模塊,允許您將內容傳回給它 b)通過某種信號觸發內容檢索。

所以,如果你真的想這樣做。我會建議以下路徑:

1)編寫一個可以傳遞程序狀態的內核模塊。我們將其稱爲kpsmod用於我們的討論。

2)它是否與用戶空間進行通信,通過某種機制(比如網絡鏈接)與用戶進程進行通信以啓動一些註冊過程,即註冊變量地址。用戶空間程序告訴模塊它有興趣在信號上「輸出」自己(比如SIGHUP或SIGUSR1);也可以編程。傳遞名稱,地址和要讀取的大小(如果需要,請輸入類型信息)。如果變量在堆棧上,應該被拒絕。應該允許全局訪問符號(爲了簡單起見)

3)您甚至可以考慮在特定變量的proc_read時訪問進程的ptrace棧。

4),則內核模塊應該創建一個的/ proc/kpsmod //瓦爾*爲每個變量,並且當變量上讀讀

5)經由PROC(潛在格式化)

轉儲存儲器內容

和瞧:-)你有你想要的效果。

3

除了使用/proc之外,還可以使用命名管道。

使用mkfifo創建FIFO,並讓程序打開它進行寫入。無論是在專門的線程還是異步的,當有人在shell中運行cat your-pipe時,程序都會生成文本。當然,cat會打開命名管道進行閱讀。

這基本上模仿了cat /proc/....接口,但不是讓內核模塊實現文本生成,而是有一個實現它的程序。