Domanda

Ho bisogno della mia applicazione Erlang per leggere e scrivere attraverso una pipa nominata.

L'apertura del tubo denominato come file fallirà con eisdir.

Ho scritto il seguente modulo, ma è fragile e si sente sbagliato in molti modi. Inoltre non riesce a leggere dopo un po '. C'è un modo per renderlo più ... elegante?

-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.

Come avrai notato, imita il formato della porta in ciò che accetta o restituisce. Voglio che sostituisca un codice C che leggerà le altre estremità dei tubi e verrà lanciato dal debugger.

È stato utile?

Soluzione

penso che eisdir Il fallimento proviene da questo codice, supponendo che tu stia eseguendo UNIX.

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

Vedere efile_openfile e efile_may_openfile. Entrambi fanno controlli che presumono se un file lo è !IS_REG(f) allora è una directory. Sembra imperfetto, ma forse ci sono buoni motivi per non aprire file non regolalari. Il kludge per /dev/null è anche una lettura interessante.

Sono stato precedentemente colpito da questo problema. Forse è tempo di graffiare un prurito.

Altri suggerimenti

Ho appena riscontrato questo problema. Nel caso in cui altri trovino questo thread in futuro, il motivo per cui Erlang non supporta l'apertura dei tubi nominati è lo stesso del motivo per cui i file del dispositivo non possono essere aperti. Questo link riassume la logica:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top