我试图写入位于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输出。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。
您可能需要使用套接字进行网络通信。
NFS被设计为一个多操作系统、最低公共分母的文件系统。因此,它不支持完整的Unix文件系统语义。特别是,FIFOs/命名管道,如果有的话,将不能在系统之间共享。(尽管两个进程在同一主机上可能能够通过NFS FIFO进行通信,但我不建议这样做)。
如果您想要完整的Unix语义,您需要使用类似RFS的东西。请注意,与NFS的可移植性和95%的解决方案相比,RFS的复杂性和降低的性能使其基本上已经过时了。跨主机进程间通信的推荐解决方案是使用BSD风格的套接字或AT&T风格的流,具体取决于您的操作系统环境。对于Linux,请使用套接字。
你有FIFO的读取器吗?FIFO会阻塞,直到另一端有读取操作。 (通常情况下,打开非阻塞模式的例外适用。)