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