/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
替换内核提供的接口。这是否是一个好主意,这是完全不同的事情。
例子: