无法通过NFS挂载写入FIFO文件

10

我试图写入位于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身份编写的

谢谢。

5个回答

10

这个回答可能已经来不及帮到您了,但值得注意的是,您可以使用命名管道和“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'

9

FIFO是一种用于进程间通信的机制。通过尝试通过NFS导出FIFO,您正在要求内核将本地进程间通信视为更多的网络通信机制。

这涉及到许多问题,其中最明显的一个问题是,在内核中的FIFO读取实现期望有一个用户空间的缓冲区来复制数据。在NFS中没有直接可用的这样的缓冲区。因此,内核不支持通过NFS导出FIFO。

您可能需要使用套接字进行网络通信。


5
这是一个命名的FIFO,但我猜它只能在挂载文件系统的系统上工作。 你有这个FIFO的读取器吗? 写入者和读取器在同一台系统上吗?
FIFO的工作原理如下:当一个进程打开FIFO时,内核会创建管道。 如果另一个进程打开FIFO,则内核会根据名称知道它是先前打开的相同管道。
这不能在两台不同的机器上工作。即,如果进程A在client1上运行,而进程B在client2上运行,则进程A和进程B无法通过FIFO进行通信,因为在每台机器上都创建了一个FIFO。
FIFO在打开之前不存在,它仅存在于本地,对文件系统的内容没有影响。

是的,我在另一端有一个读取器。我原以为可以通过NFS访问我所能看到的任何文件。 - jackhab

0

NFS被设计为一个多操作系统、最低公共分母的文件系统。因此,它不支持完整的Unix文件系统语义。特别是,FIFOs/命名管道,如果有的话,将不能在系统之间共享。(尽管两个进程在同一主机上可能能够通过NFS FIFO进行通信,但我不建议这样做)。

如果您想要完整的Unix语义,您需要使用类似RFS的东西。请注意,与NFS的可移植性和95%的解决方案相比,RFS的复杂性和降低的性能使其基本上已经过时了。跨主机进程间通信的推荐解决方案是使用BSD风格的套接字或AT&T风格的流,具体取决于您的操作系统环境。对于Linux,请使用套接字。


0

你有FIFO的读取器吗?FIFO会阻塞,直到另一端有读取操作。 (通常情况下,打开非阻塞模式的例外适用。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接