拿着它:
- 在一个终端中,
touch myfile echo some text >> myfile # returns straight away
- 在另一个终端,
cat myfile # prints "some text"
- 现在我能
rm myfile
现在这个:
- 在一个终端中
mkfifo mypipe echo some text > mypipe # does not return yet
- 在另一个终端
cat mypipe # prints "some text"
echo
第一个终端中的返回- 现在我能
rm myfifo
我认为这两个场景之间唯一的区别是
- 一个使用
touch
,一个使用mkfifo
创建一个“文件”,在不知道其他任何东西的情况下,就像使用另一个命令做类似的事情一样, - 最重要的是,
echo
直到读取操作返回后,管道才会返回。
我猜想 2 是命名管道与常规文件相比的特殊之处。
但是命名管道有什么特别之处呢?
我读到它们用于进程间通信,但我认为进程也可以只使用常规文件。但如果是这样的话,管道就不会存在,所以我一定是错的。
这是一个非常简单的例子,却让我完全困惑:
如果我在一个终端中
mkfifo mypipe
while true; do date > mypipe ; done
它会继续写入(据我所知,覆盖)到管道,但是从管道中读取一次会产生比我预期更多的输出,例如这个
cat myfifo
多次打印同一日期,通常为 4 次,但有时为 5 或 6 次。