如果我创建一个命名管道然后对其进行读/写,命名管道所在的文件系统是否会受到影响?即,数据在读取之前缓冲在文件系统上,还是仅驻留在内存中?
答案1
文件对象本身是在文件系统中创建的,但文件系统中不存储任何数据。来自 mkpipe(3) 联机帮助页:
A FIFO special file is similar to a pipe, except that it is created in
a different way. Instead of being an anonymous communications channel,
a FIFO special file is entered into the file system by calling
mkfifo().
数据可能唯一存储在磁盘上的时间是在休眠期间,此时内存被写入交换空间(包括缓冲区)——但这只是一种特殊情况。
答案2
没有。写入命名管道不会修改文件系统(访问时间除外)。
这是一个演示:
$ mkdir test
$ mkdir test-ro
$ mkfifo test/fifo
$ mount --bind test test-ro
$ mount -o remount,ro test-ro
$ cat test/fifo & echo something >> test/fifo
something
正如您所看到的,即使 fifo 位于只读文件系统上,我们也能够对其进行写入。
命名管道不在文件系统上存储任何管道数据。它们的数据缓冲在内存中,与文件系统缓冲区分开。