/sys
内核空间设备驱动程序通常实现通过或显示的目录和文件/proc
。长时间运行的用户空间程序也可以这样做吗?
我有一个守护进程或长时间运行的程序,需要能够查询某些数据,并在运行时由外部程序设置一些数据。
我可以做一个完整的套接字接口,但这对于程序和外部请求者来说是很大的开销。
正如 Linux 内核开发人员发现的那样,使用“一切都是文件”模型对于调整内核设置非常有用。我也想做同样的事。
有些人可能认为/sys
目录是内核的神圣空间,但我没有看到什么是“系统”和其他一些服务/服务器/应用程序之间的重要界限。
使用保险丝... 我决定使用 FUSE,即“USERspace 中的文件系统”包 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 >”显示将一个值传递到程序中。所以我很容易在程序运行时查看和查看程序的各种参数。
答案1
我认为没有任何方法可以在内核之外添加/sys
或条目。/proc
因为/sys
无论如何它都没有多大意义——它是 kobject 数据结构的直接表示。
但是,您可以从用户空间提供类似的接口,例如使用 FIFO;看mkfifo
了解详情。您可以在 FIFOsysvinit
中看到它的实现initctl
。
答案2
他们当然可以。您可以安装任何事物(实际磁盘文件系统、熔断器文件系统、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