使用者空間程序可以提供/實現 sysfs 或 procfs 文件以將數據傳入和傳出程序嗎?
/sys
核心空間設備驅動程序通常實現通過或顯示的目錄和文件/proc
。長期執行的使用者空間程序也能做到這一點嗎?我有一個守護程序或長時間執行的程序,需要能夠查詢某些數據並在執行時由外部程序設置一些數據。
我可以做一個完整的套接字介面,但這對程序和外部請求者來說是很多成本。
正如 linux 核心開發人員發現的那樣,使用“一切都是文件”模型對於調整核心設置很有用。我也想這樣做。
有些人可能認為
/sys
目錄是核心的神聖空間,但我沒有看到什麼是“系統”與其他一些服務/伺服器/應用程序之間的重要界線。使用 FUSE… 我決定使用 FUSE,即“使用者空間中的文件系統”包 libfuse3.so。(在為它編寫了一個包裝器之後……)我可以定義一個結構數組,每個訪問變數/文件一個:
struct fileObj files[] = { {"mode", mode, getFunc, putFunc}, {"numbProcs", numbProcs, getFunc, putFunc}, {"svrHostPort", hostPort, getFunc, putFunc}, {"somethingWO", jakeBuf, NULL, putFunc}, // Write only file (why?) {"timestamp", NULL, getTimestampFunc, NULL}, // Returns timestamp, R/O {0} };
FUSE 文件系統的掛載點是’/ssm/fuse’…’ls -l’ 表明’files’ 數組中的每個條目都顯示為一個文件,一些 R/O,一些 R/W,一個 W /O。‘get’ 函式位置中的 ‘getTimestampFunc 表明可以將特殊函式與文件關聯以執行計算響應。
ribo@box:~/c$ ls -l /ssm/fuse total 0 -rw-r--r-- 1 ribo ribo 10 Dec 28 17:17 mode -rw-r--r-- 1 ribo ribo 1 Dec 28 17:17 numbProcs --w------- 1 ribo ribo 3 Dec 28 17:17 somethingWO -rw-r--r-- 1 ribo ribo 5 Dec 28 17:17 svrHostPort -r--r--r-- 1 ribo ribo 32 Dec 28 17:17 timestamp ribo@box:~/c$ cat /ssm/fuse/timestamp 18/12/28 17:17:27ribo@box:~/c$cat /ssm/fuse/mode hyperSpeedribo@box:~/c$ echo slow >/ssm/fuse/mode ribo@box:~/c$ cat /ssm/fuse/mode slow
’echo >’ 顯示將值傳遞到程序中。所以我很容易在程序執行時查看和查看程序的各種參數。
我認為沒有任何方法可以在核心之外添加
/sys
或條目。/proc
因為/sys
無論如何它都沒有多大意義——它是 kobject 資料結構的直接表示。但是,您可以從使用者空間提供類似的介面,例如使用 FIFO;詳情見
mkfifo
。sysvinit
你可以在它的initctl
FIFO中看到它的實現。
他們當然可以。你可以在下面掛載任何東西(實際的磁碟文件系統、熔斷文件系統、overlayfs、tmpfs、綁定掛載等) ,擴展和/
/sys
或/proc
替換核心提供的介面。這是否是一個好主意,這是完全不同的事情。
例子:
# unshare -m # touch /tmp/foo # mount -B /tmp/foo /proc/1/status # echo FOR GREAT JUSTICE > /proc/1/status # cat /proc/1/status