我正在尝试写入位于 NFS 挂载上的 FIFO 文件,但它会阻塞。可能是什么问题呢?
我的 /etc/export:
/tmp/test/ 10.0.0.0/24(rw,no_root_squash,async)
NFS 服务器和客户端上的 ls /tmp/test 是一样的
prw--w--w- 1 root root 0 2009-06-24 17:28 ui-input
我正在以root身份写作
谢谢。
此响应现在可能为时已晚,无法为您提供帮助,但值得注意的是,您可以使用命名管道和“nc”(netcat)命令实现类似的效果。Netcat 可以接受来自标准输入(或命名管道)的输入,并通过套接字将其回显到另一台主机上的另一个 netcat 实例,可选地发送到命名管道。
所以基本上,您的设置如下所示:
Host1$ mkfifo Host1_named_pipe
Host1$ nc -l 1234 > Host1_named_pipe
Host2$ mkfifo Host2_named_pipe
Host2$ nc Host1 1234 < Host2_named_pipe
现在,当您在 Host2 上运行程序并将其输出发送到 Host2_named_pipe 时,该输出将来自 Host1 上的 Host1_named_pipe。
或通过 ssh :
Host1$ mknode Host1_named_pipe p
Host2$ mknode Host2_named_pipe p
Host1$ cat Host1_named_pipe | ssh Host2 'cat - > Host2_named_pipe'
FIFO 是一种进程间通信机制。通过尝试通过 NFS 导出 FIFO,您要求内核将本地进程间通信更多地视为一种网络通信机制。
有许多与此相关的问题,最明显的一个是内核内部的 FIFO 读取实现需要用户空间中的缓冲区来将数据复制到。这样的缓冲区在 NFS 中不直接可用。因此,内核不支持通过 NFS 导出 FIFO。
您可能希望改用套接字进行网络通信。
它是一个名为 fifo,但我猜它只适用于安装文件系统的系统。你有这个fifo的读者吗?作者和读者在同一个系统上吗?
fifo 的工作原理是这样的:当进程打开 fifo 时,内核会创建管道。如果另一个进程打开了 fifo,那么内核(从名称中)知道它与之前打开的管道是同一个管道。
这不能在两台不同的机器上工作。即如果进程A运行在client1上,进程B运行在client2上,那么进程A和进程B就不能通过fifo进行通信,因为每台机器上都创建了一个fifo。
fifo 在打开之前不存在,并且仅在本地退出,它对文件系统的内容没有影响。
NFS 被设计为一个多操作系统、最小公分母文件系统。因此,它不支持完整的 Unix 文件系统语义。特别是,FIFO/命名管道(如果有的话)将不会在系统之间共享。(同一主机上的两个进程可能能够通过 NFS FIFO 进行通信,但我不建议这样做)。
如果你想要完整的 Unix 语义,你必须使用类似RFS的东西。请注意,与 NFS 的可移植性和 95% 解决方案相比,RFS 的复杂性和降低的性能使其基本上已经过时。跨主机进程间通信的推荐解决方案是使用 BSD 样式的套接字或 AT&T 样式的流,具体取决于您的操作系统环境。对于 Linux,使用套接字。
你在 FIFO 上有读卡器吗?FIFO 将阻塞,直到另一端有读取内容为止。(以非阻塞模式打开的通常例外情况适用。)