4

名前付きパイプを介して読み書きするには、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 コードを置き換える必要があります。

4

2 に答える 2

2

eisdirUnixで実行していると仮定すると、失敗はこのコードに起因すると思います。

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

efile_openfileおよびを参照してくださいefile_may_openfile。どちらも、ファイルが!IS_REG(f)ディレクトリであるかどうかを確認するチェックを行います。これには欠陥があるように見えますが、通常ではないファイルを開かない十分な理由があるかもしれません。ためのクラッジ/dev/nullも興味深い読み物です。

私も以前にこの問題に見舞われました。たぶん、かゆみを掻く時が来ました。

于 2010-04-15T07:57:16.523 に答える
2

この問題に遭遇しました。他の人が将来このスレッドを見つけた場合に備えて、Erlang が名前付きパイプを開くことをサポートしていない理由は、デバイス ファイルを開くことができない理由と同じです。このリンクは、理論的根拠を要約しています。

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

于 2013-11-08T16:54:24.727 に答える