为了提高 FIFO 管道速度,我考虑将其放置在名为 的 RAM 磁盘中/dev/shm
。我看到那里已经有一些文件:
$ ll /dev/shm
total 1536
drwxrwxrwt 2 root root 280 Oct 2 17:19 ./
drwxr-xr-x 22 root root 4840 Oct 2 05:49 ../
-rwx------ 1 rick rick 67108904 Oct 2 04:29 pulse-shm-1087740037*
-rwx------ 1 lightdm lightdm 67108904 Oct 2 04:29 pulse-shm-1609193682*
-rwx------ 1 rick rick 67108904 Oct 2 04:34 pulse-shm-2114917541*
-rwx------ 1 rick rick 67108904 Oct 2 04:29 pulse-shm-2616701246*
-rwx------ 1 rick rick 67108904 Oct 2 17:14 pulse-shm-3211887872*
-rwx------ 1 rick rick 67108904 Oct 2 17:14 pulse-shm-3411101615*
-rwx------ 1 rick rick 67108904 Oct 2 04:32 pulse-shm-3740841284*
-rwx------ 1 lightdm lightdm 67108904 Oct 2 04:29 pulse-shm-4039050064*
-rwx------ 1 rick rick 67108904 Oct 2 04:29 pulse-shm-608722223*
-rwx------ 1 rick rick 67108904 Oct 2 05:46 pulse-shm-629296834*
-rwx------ 1 rick rick 67108904 Oct 2 17:19 pulse-shm-791566179*
-rwx------ 1 lightdm lightdm 67108904 Oct 2 04:29 pulse-shm-871250926*
是否可以安全地假设该目录在所有 Ubuntu 系统上都是通用的,或者甚至在所有 Linux 系统上都是通用的?
如果目录不存在,我将创建管道 FIFO 文件,/tmp
但希望这种情况永远不会发生。
编辑:非常感谢下面两个很棒的答案,我找到了这篇文章:为什么在 Linux 上使用命名管道
为什么要使用命名管道?
命名管道很少使用是有原因的。在 Unix 系统上,几乎总是有很多方法可以做几乎相同的事情。有很多方法可以写入文件、从文件读取和清空文件,尽管命名管道具有一定的效率。
首先,命名管道内容驻留在内存中,而不是写入磁盘。只有当管道两端都已打开时,才会传递内容。而且,在另一端打开并读取之前,您可以多次写入管道。
答案1
对于 Linux,是的,它是普遍可用的,并且根据文档(https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt) glibc,Linux 的标准 C 库预计/dev/shm
存在。
不过,我还是建议你重新考虑一下你的脚本或程序的设计。FIFO 和套接字通常被放置在/var/run/appname
或/tmp/
目录中。一个很好的例子就是/var/run/acpid.socket
。由于这些文件系统也是 tmpfs,就像 一样/dev/shm
,因此性能没有差异。
顺便说一句,将 FIFO 放在 tmpfs 中不会影响性能,因为管道在 Linux 上具有 65536 字节的硬编码缓冲区大小,但可以通过 /proc/sys/fs/pipe-max-size 进行更改。请参阅https://unix.stackexchange.com/a/11954/85039
答案2
通过 FIFO 特殊文件传输的数据永远不会到达文件系统。这意味着无论底层文件系统是 tmpfs 还是 ext2,FIFO 的速度都应该相同。
/dev/shm
旨在供 POSIX 共享内存实现使用。对于其他用途,/tmp
或/run
更合适。如果您的命名管道是用户特定的,请$XDG_RUNTIME_DIR
使用XDG 基础目录规范可能是合适的。