关于性能问题,管道比文件更有效,因为不需要磁盘IO。因此,cmd1 | cmd2
它的效率比cmd1 > tmpfile; cmd2 < tmpfile
(如果tmpfile
以命名管道的形式备份在RAM磁盘或其他存储设备上,则可能不正确;但是如果是命名管道,cmd1
则应在后台运行,因为如果管道已满,其输出可能会阻塞)。如果您需要结果cmd1
并将其输出发送到cmd2
,则应cmd1 | tee tmpfile | cmd2
允许cmd1
并cmd2
并行运行,避免从进行磁盘读取操作cmd2
。
如果许多进程读/写同一管道,则命名管道很有用。当程序未设计为将stdin / stdout用于需要使用文件的 IO时,它们也很有用。我将文件用斜体表示,因为命名管道不是驻留在内存中的文件,因为它们驻留在内存中并且具有固定的缓冲区大小,即使它们具有文件系统条目(仅供参考)。其他的事情在UNIX文件系统有没有条目被文件:只是觉得/dev/null
,还是别人的条目/dev
或/proc
。
由于管道(命名管道和未命名管道)具有固定的缓冲区大小,因此它们的读取/写入操作可能会阻塞,从而导致读取/写入过程进入IOWait状态。另外,从存储缓冲区读取时何时收到EOF?有关此行为的规则定义明确,可以在该人员中找到。
您无法使用管道(命名管道和未命名管道)做的一件事是在数据中查找。由于它们是使用内存缓冲区实现的,因此这是可以理解的。
关于"everything in Linux/Unix is a file"
,我不同意。命名管道具有文件系统条目,但不完全是文件。未命名的管道没有文件系统条目(可能在中除外/proc
)。但是,在UNIX上,大多数IO操作都是使用读/写功能完成的,该功能需要文件描述符,包括未命名的管道(和套接字)。我认为我们不能这么说"everything in Linux/Unix is a file"
,但是我们可以肯定地说"most IO in Linux/Unix is done using a file descriptor"
。