2010-04-14 9 views
4

J'ai besoin de mon application erlang pour lire et écrire dans un tube nommé.Comment lire/écrire depuis erlang vers un tube nommé?

L'ouverture du tube nommé en tant que fichier échouera avec eisdir.

J'ai écrit le module suivant, mais il est fragile et se sent mal à bien des égards. En outre, il échoue à la lecture après un certain temps. Y a-t-il un moyen de le rendre plus ... élégant?

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

Comme vous l'avez peut-être remarqué, il imite le format du port dans ce qu'il accepte ou retourne. Je veux qu'il remplace un code C qui va lire les autres extrémités des tuyaux et être lancé depuis le débogueur.

Répondre

2

Je pense que l'erreur eisdir provient de ce code, en supposant que vous utilisez Unix.

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

Voir efile_openfile et efile_may_openfile. Ils font tous les deux des vérifications qui supposent si un fichier est !IS_REG(f) alors c'est un répertoire. Cela semble défectueux, mais il y a peut-être de bonnes raisons de ne pas ouvrir les fichiers non réguliers. Le kludge pour /dev/null est aussi une lecture intéressante.

J'ai déjà été touché par ce problème. Peut-être qu'il est temps de gratter une démangeaison.

+0

Merci pour le pointeur. Je pourrais gratter. – cstar

2

Je viens de rencontrer ce problème. Au cas où d'autres trouveraient ce fil dans le futur, la raison pour laquelle Erlang ne supporte pas l'ouverture de canaux nommés est la même que celle pour laquelle les fichiers de périphériques ne peuvent pas être ouverts. Ce lien résume la raison d'être:

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

Questions connexes