Как читать / писать из эрланга в именованный канал? - PullRequest
4 голосов
/ 14 апреля 2010

Мне нужно мое приложение 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, который будет читать другие концы каналов и запускаться из отладчика.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2013

Я только что столкнулся с этой проблемой. В случае, если другие найдут этот поток в будущем, причина, по которой Erlang не поддерживает открытие именованных каналов, такая же, как то, почему файлы устройств не могут быть открыты. Эта ссылка обобщает обоснование:

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

2 голосов
/ 15 апреля 2010

Я думаю, что ошибка eisdir происходит из этого кода, если вы работаете в Unix.

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

См. efile_openfile и efile_may_openfile. Они оба делают проверки, которые предполагают, что если файл !IS_REG(f), то это каталог. Это кажется ошибочным, но, возможно, есть веские причины не открывать нестандартные файлы. Kludge для /dev/null также интересно читать.

Ранее я тоже столкнулся с этой проблемой. Может быть, пора чесать зуд.

...