![有没有办法实现像 /proc 文件系统中的“文件”一样工作的自定义文件?](https://linux22.com/image/107800/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E5%AE%9E%E7%8E%B0%E5%83%8F%20%2Fproc%20%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%9A%84%E2%80%9C%E6%96%87%E4%BB%B6%E2%80%9D%E4%B8%80%E6%A0%B7%E5%B7%A5%E4%BD%9C%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我正在寻找类似持久命名管道的东西...我可以多次使用 cat 或 grep ,并且始终获取输入管道的任何进程的当前状态。
例如,假设我创建一个名为 的命名管道/tmp/timestamp
,然后使用date
写入它:
mkfifo /tmp/timestamp
date --iso-8601=seconds > /tmp/timestamp
此时,对的调用date
将阻塞,等待/tmp/timestamp
被读取...
cat `/tmp/timestamp`
将取消阻止date
,我会看到类似2017-03-18T16:11:54-04:00
写入标准输出的内容,然后date
终止。
...但是如果我每次都想要更新日期怎么办cat /tmp/timestamp
?
我猜可能是
while :; date --iso-8601=seconds > /tmp/timestamp; done
会起作用,但我想知道a)这种方法是否存在任何不明显的问题,b)是否有一种不需要循环的方法来做到这一点。
我还想将其设置为自动启动,使 fifo 始终可用。
就为什么我希望将其放在管道中——相关信息存储在支持 Web 应用程序的数据库中。我们的大多数技术支持人员都非常乐意通过 ssh 登录服务器并对数据库运行查询,但有一些重要的统计数据真的方便地从文件中简单地 grep 。能够访问ls
包含命名管道的目录将使所有这些都可以被发现......本质上,我这样做不是因为我必须这样做,我这样做是因为我认为这是一个很好的隐喻。
答案1
您可以将自定义文件系统实现为内核模块或使用熔断器。在该自定义文件系统中,您可以拥有任何您想要的虚拟文件。
答案2
这是循环的一个“不明显的问题”:如果读取进程保持 fifo 打开(因为,比如说,它在打开另一个文件时阻塞或被挂起),则写入循环将连续运行(直到它填满 fifo 缓冲区) 。多个并发读取器也存在问题,但也许您可以合理地消除这种可能性。
至于非循环解决方案,您可以使用套接字而不是 fifo,但是您必须编写一个(简单的)读取器程序(如果您想运行除之外的程序,则使用管道cat
),因为您不能只使用open
那些。