与常规文件相比,命名管道有何特殊之处?

与常规文件相比,命名管道有何特殊之处?

拿着它:

  • 在一个终端中,
    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

我认为这两个场景之间唯一的区别是

  1. 一个使用touch,一个使用mkfifo创建一个“文件”,在不知道其他任何东西的情况下,就像使用另一个命令做类似的事情一样,
  2. 最重要的是,echo直到读取操作返回后,管道才会返回。

我猜想 2 是命名管道与常规文件相比的特殊之处。

但是命名管道有什么特别之处呢?

我读到它们用于进程间通信,但我认为进程也可以只使用常规文件。但如果是这样的话,管道就不会存在,所以我一定是错的。


这是一个非常简单的例子,却让我完全困惑:

如果我在一个终端中

mkfifo mypipe
while true; do date > mypipe ; done

它会继续写入(据我所知,覆盖)到管道,但是从管道中读取一次会产生比我预期更多的输出,例如这个

cat myfifo

多次打印同一日期,通常为 4 次,但有时为 5 或 6 次。

相关内容