如何制作一个在读取时执行代码的特殊文件

Chr*_*oba 7 filesystems files

Linux 系统上的大多数文件都是普通文件,即它们保存在磁盘上,读取它们只是从磁盘上的指定内存块中读取。就能够像普通文件一样从文件中读取数据,我如何制作一些行为类似于文件的东西,但实际上返回的是以编程方式生成的数据?作为一个具体的例子,一个下载当前 google.com 并返回它的文件,这样cat ~/myspecialfile会将 google.com 的内容输出到 stdout?

Ken*_*ter 8

正如其他答案所表明的那样,您可以使用命名管道完成您要求的部分操作。对于完整的解决方案,您必须开发某种虚拟文件系统,以便在访问虚拟文件系统上的路径时采取所需的操作。有几种方法可以做到这一点:

  • 编写内核模式文件系统驱动程序,如procfs驱动程序。
  • 编写用户模式文件系统实现,例如使用FUSE
  • 编写一个提供NFS 服务器接口或其他网络文件系统协议的程序。
  • 也许是一个伪装成 USB 文件存储设备或其他硬件的程序。


Dig*_*uma 7

可以想象,您可以使用 FIFO/命名管道执行以下操作:

$ mkfifo ~/myspecialfile
$ wget -q -O ~/myspecialfile google.com &
[2] 26186
$ 
Run Code Online (Sandbox Code Playgroud)

mkfifo创建一个名为 ~/myspecialfile 的命名管道。 wget然后将其输出定向到该命名管道。您可以从该命名管道中读取(一次),就像它是一个常规文件一样。例如获取wc该文件的计数:

$ wc ~/myspecialfile
      7     430   17738 /home/ubuntu/myspecialfile
[2]+  Done                    wget -q -O ~/myspecialfile google.com
$ 
Run Code Online (Sandbox Code Playgroud)

请注意,通常编写器(wget在本例中)将open()使用 O_WRONLY 标志的管道。此open()调用通常会阻塞,直到读取器(wc在本例中)使用 O_RDONLY 标志打开管道的另一端。因此,这里的wget过程将立即启动,但在阅读器(打开并)开始阅读之前,它不会在后台执行任何操作。我已经在 Ubuntu 14.04 上使用 wireshark 验证了这种行为。

  • 不过,这将立即运行 `wget`,对吗?不只是在读取文件时? (3认同)