Fuse

使用者空間程序可以提供/實現 sysfs 或 procfs 文件以將數據傳入和傳出程序嗎?

  • December 29, 2018

/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;詳情見mkfifosysvinit你可以在它的initctlFIFO中看到它的實現。

他們當然可以。你可以在下面掛載任何東西(實際的磁碟文件系統、熔斷文件系統、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

引用自:https://unix.stackexchange.com/questions/491140