【问题标题】:How to read/write from erlang to a named pipe?如何从erlang读/写到命名管道?
【发布时间】:2010-04-14 14:04:42
【问题描述】:

我需要我的 erlang 应用程序通过命名管道进行读写。

将命名管道作为文件打开将失败并显示eisdir

我编写了以下模块,但它很脆弱,并且在很多方面都感觉不对。一段时间后它也无法阅读。有没有办法让它更...优雅?

-module(port_forwarder).
-export([start/2, forwarder/2]).

-include("logger.hrl").

start(From, To)->
    spawn(fun() -> forwarder(From, To) end).

forwarder(FromFile, ToFile) ->
  To = open_port({spawn,"/bin/cat > " ++ ToFifo}, 
                   [binary, out, eof,{packet, 4}]),
  From = open_port({spawn,"/bin/cat  " ++ FromFifo}, 
                   [binary, in, eof, {packet, 4}]),
  forwarder(From, To, nil).

forwarder(From, To, Pid) ->
  receive
    {Manager, {command, Bin}} ->
      ?ERROR("Sending : ~p", [Bin]),
      To ! {self(), {command, Bin}},
      forwarder(From, To, Manager);
    {From ,{data,Data}} ->
      Pid ! {self(), {data, Data}},
      forwarder(From, To, Pid);
    E -> 
      ?ERROR("Quitting, first message not understood : ~p", [E])
  end.

您可能已经注意到,它在接受或返回的内容中模仿了端口格式。 我希望它替换将读取管道另一端并从调试器启动的 C 代码。

【问题讨论】:

    标签: erlang named-pipes fifo


    【解决方案1】:

    假设您在 Unix 上运行,我认为 eisdir 失败来自此代码。

    https://github.com/erlang/otp/blob/master/erts/emulator/drivers/unix/unix_efile.c

    efile_openfileefile_may_openfile。他们都做检查假设如果一个文件是!IS_REG(f) 那么它是一个目录。这似乎有缺陷,但也许有充分的理由不打开非常规文件。 /dev/null 的组合也很有趣。

    我之前也遇到过这个问题。也许是时候抓挠痒痒了。

    【讨论】:

      【解决方案2】:

      我刚刚遇到了这个问题。万一以后别人发现这个线程,Erlang不支持打开命名管道的原因和设备文件打不开的原因是一样的。此链接总结了基本原理:

      http://www.erlang.org/faq/problems.html#id56464

      【讨论】:

      • Erlang 确实支持打开命名管道,但不支持将它们作为文件打开。这是您的回复中遗漏的一个非常重要的区别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多