2009-08-14 8 views
5

Comment rincer le tampon io dans Erlang?Comment vider le tampon io dans Erlang?

Pour instace:

io:format("hello") ou io:format(user, "hello")

This post semble indiquer qu'il n'y a pas de solution propre.

Y a-t-il une meilleure solution que dans ce poste?

+0

Désolé, je n'ai pas de réponse, mais une question. Je suis incroyablement curieux de savoir pourquoi vous voudriez vider le tampon io, donc; Pourquoi? :) –

+0

AFAIK ce n'est pas possible avec l'implémentation actuelle du serveur io. Votre lien est brisé, mais celui-ci fait référence à un problème causé par l'absence d'opérations de vidage: http://erlang.org/pipermail/erlang-questions/2011-April/057492.html –

Répondre

5

Malheureusement autre que la mise en œuvre correctement une « commande » flush dans les sous-systèmes io/noyau et en vous assurant que les pilotes de bas niveau qui mettent en œuvre le support io réelle d'une telle commande, vous devez vraiment compter simplement sur le système mise au repos avant fermeture. Un échec je pense. Jetez un oeil à io.erl/io_lib.erl dans stdlib et file_io_server.erl/prim_file.erl dans le noyau pour les détails sanglants.

A titre d'exemple, en file_io_server (qui prend efficacement la demande de io/io_lib et l'achemine vers le pilote approprié), les types de commandes sont:

{put_chars,Chars} 
{get_until,...} 
{get_chars,...} 
{get_line,...} 
{setopts, ...} 

(c.-à-pas de chasse d'eau)! En alternative, vous pouvez bien sûr toujours fermer votre sortie (ce qui forcerait un flush) après chaque écriture. Un module de journalisation je fait quelque chose comme ça à chaque fois et il ne semble pas que lent (c'est un gen_server avec l'enregistrement reçu via des messages cast):

case file:open(LogFile, [append]) of 
    {ok, IODevice} -> 
    io:fwrite(IODevice, "~n~2..0B ~2..0B ~4..0B, ~2..0B:~2..0B:~2..0B: ~-8s : ~-20s : ~12w : ", 
      [Day, Month, Year, Hour, Minute, Second, Priority, Module, Pid]), 
    io:fwrite(IODevice, Msg, Params), 
    io:fwrite(IODevice, "~c", [13]), 
    file:close(IODevice); 
+0

Non que je l'ai déjà fait, mais d'après ce que je comprends, la mise en œuvre d'un serveur io n'est pas si complexe, d'autant plus que vous pouvez utiliser io_lib pour certaines demandes plus complexes. Je pense que vous êtes sur quelque chose avec le module de fichier, en utilisant le fichier: Sync/1 appel on peut synchroniser la sortie explicitement. Il ne sera simplement pas fait en utilisant un io-appel, mais un message personnalisé, sauf si on l'attache à la requête io: nl (IO). – Christian

-4

vous pouvez exécuter

flush(). 

de la coquille, ou essayez

flush()-> 
receive 
    _ -> flush() 
after 0 -> ok 
end. 

qui fonctionne plus ou moins comme une chasse d'eau C.

+3

Ceci vide la boîte aux lettres de processus et non le tampon io. – hcs42

+0

@Fonz, je suggère d'enlever votre réponse, car il est hors de propos, faites attention! – securecurve

0
io:put_chars(<<>>) 

à la fin du script fonctionne pour moi.