【问题标题】:Can't write to FIFO file mouted via NFS无法写入通过 NFS 调出的 FIFO 文件
【发布时间】:2010-11-05 13:03:47
【问题描述】:

我正在尝试写入位于 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 身份写的

谢谢。

【问题讨论】:

    标签: linux nfs fifo


    【解决方案1】:

    此响应现在可能为时已晚,无法为您提供帮助,但值得注意的是,您可以使用命名管道和“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】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        这不能在两台不同的机器上工作。即如果进程A运行在client1上,进程B运行在client2上,那么进程A和进程B不能通过fifo进行通信,因为每台机器上都会创建一个fifo。

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

        【讨论】:

        • 是的,我在另一端确实有一个读者。我以为我可以通过 NFS 访问我可以看到的任何文件。
        【解决方案4】:

        您在 FIFO 上有读卡器吗? FIFO 将阻塞,直到另一端有读取内容为止。 (以非阻塞模式打开的通常例外情况适用。)

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-07-09
            • 1970-01-01
            • 2012-05-09
            • 1970-01-01
            • 2017-09-14
            • 1970-01-01
            • 2018-03-07
            相关资源
            最近更新 更多