无法写入通过NFS模拟的FIFO文件

我试图写入NFS文件,findNFS挂载,并阻止。 可能是什么问题呢?

我的/ 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 

我正在写根

谢谢。

Solutions Collecting From Web of "无法写入通过NFS模拟的FIFO文件"

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

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

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

这是一个名为fifo,但我想它只适用于文件系统挂载的系统。 你在这个fifo上有读者吗? 作者和读者是否在同一个系统上?

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

这不能在两台不同的机器上工作。 也就是说,如果进程A在客户机1上运行,进程B在客户机2上运行,则进程A和进程B不能通过先进先出进行通信,因为在每台机器上都会创建一个先进先出。

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

这个响应现在可能为时已晚,但值得注意的是,使用命名管道和“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上有读者吗? FIFO将阻塞,直到另一端有东西读取。 (在非阻塞模式下打开的常规例外情况适用。)

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

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