无法写入通过NFS mowted的FIFO文件

时间:2009-06-24 14:37:00

标签: linux nfs fifo

我正在尝试写入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 个答案:

答案 0 :(得分:7)

FIFO意味着进程间通信机制。通过尝试通过NFS导出FIFO,您要求内核将本地进程间通信视为更多的网络通信机制。

存在许多与此相关的问题,最明显的一个问题是内核中的FIFO读取实现需要用户空间中的缓冲区将数据复制到。 NFS中不能直接使用这样的缓冲区。因此,内核不支持通过NFS导出FIFO。

您可能希望使用套接字进行网络通信。

答案 1 :(得分:6)

这个响应可能为时已晚,无法帮助您,但值得注意的是,您可以使用命名管道和“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'

答案 2 :(得分:5)

这是一个名为fifo,但我想它只能在安装文件系统的系统上运行。 你有这个fifo的读者吗? 作者和读者是否在同一个系统上?

fifo的工作方式如下:当进程打开fifo时,内核会创建管道。 如果另一个进程打开fifo,那么内核知道(从名称)它与先前打开的那个管道相同。

这不能在两台不同的机器上运行。即如果进程A在client1上运行而进程B在client2上运行,则进程A和进程B无法通过fifo进行通信,因为在每台机器上都创建了一个fifo。

fifo在打开之前不存在,它只在本地退出,它对文件系统的内容没有影响。

答案 3 :(得分:0)

你有一个关于FIFO的读者吗? FIFO会阻塞,直到另一端有读物。 (适用于非阻塞模式的常用例外情况。)

答案 4 :(得分:0)

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

如果你想要完整的Unix语义,你必须使用像RFS这样的东西。请注意,与NFS的可移植性和95%解决方案相比,RFS的复杂性和降低的性能使其基本上已过时。跨主机进程间通信的推荐解决方案是使用BSD样式套接字或AT&amp; T样式Streams,具体取决于您的OS环境。对于Linux,请使用套接字。

相关问题