用户空间程序可以提供/实现 sysfs 或 procfs 文件来将数据传入和传出程序吗?

用户空间程序可以提供/实现 sysfs 或 procfs 文件来将数据传入和传出程序吗?

/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

相关内容