TL/DR: utilizar IO::Handle
y el método flush
, por ejemplo:
use IO::Handle;
$myfile->flush();
En primer lugar, tiene que decidir cómo "enrojecimiento" que lo desee. Puede haber bastantes capas de almacenamiento en búfer:
El búfer interno de Perl en el identificador de archivo. Otros programas no pueden ver datos hasta que haya dejado este búfer.
Almacenamiento en búfer de nivel de sistema de archivos de bloques de archivos "sucios". Otros programas aún pueden ver estos cambios, parecen "escritos", pero se perderán si el sistema operativo o la máquina fallan.
Almacenamiento en memoria intermedia del nivel de disco de las escrituras. El SO cree que están escritos en el disco, pero el disco en realidad solo los almacena en la memoria volátil de la unidad. Si el sistema operativo falla, los datos no se perderán, pero si falla la energía, es posible que el disco no pueda escribirlos primero. Este es un gran problema con los SSD de consumo baratos.
Se complica aún más cuando se utilizan SAN, sistemas de archivos remotos, controladores RAID, etc. Si está escribiendo a través de tuberías, también está el buffer de tuberías a considerar.
Si lo que desea es vaciar el búfer Perl, puede close
el archivo, print
una cadena que contiene "\n"
(ya que parece que Perl vuelca en nuevas líneas), o use IO::Handle
's flush
method.
También puede, por the perl faq usar binmode
o jugar con $|
para hacer que el archivo se maneje sin búfer. Esto es , no es lo mismo que como enjuagar un identificador almacenado en el búfer, ya que poner en cola un montón de escrituras con búfer y luego hacer un único enrojecimiento tiene un costo de rendimiento mucho menor que escribir en un identificador sin búfer.
Si desea vaciar el búfer de escritura del sistema de escritura de archivos, debe usar una llamada al sistema como fsync()
, abrir su archivo en el modo O_DATASYNC
, o usar una de las muchas otras opciones. Es dolorosamente complicado, como lo demuestra el hecho de que PostgreSQL has its own tool just to test file syncing methods.
Si quiere asegurarse de que realmente, honestamente, en el disco duro en el almacenamiento permanente debe enjuagarlo en el sistema de archivos de su programa. También necesita configurar el disco duro/SSD/controlador RAID/SAN/lo que sea para que realmente se descargue cuando el sistema operativo se lo solicite. Esto puede ser sorprendentemente complicado de hacer y es bastante específico de OS/hardware. Se recomienda encarecidamente la prueba de "conectar y tirar" para asegurarse de que realmente lo hizo bien.
En Perl "básico" no hay función de vaciado, pero si Usted llama a 'binmode $ filehandle' establecerá el formato': raw' y (como un efecto secundario) hará un color. Funciona bien De todos modos, si está en un * x, puede crear un conducto con nombre en el sistema de archivos, y puede escribir en él directamente. – TrueY
Haga que su programa C++ lea desde una tubería ('/ dev/stdin' si es lo suficientemente estúpido como para requerir un nombre de archivo) y verifique que realmente pueda leer una línea a la vez; si usa lectura almacenada en bloque, no hay nada que pueda hacer en el lado de la escritura. – reinierpost