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);
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? :) –
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 –