Entrada/Salida sin Buffers

Una fuente de problemas cuando se usan pipes entre procesos es el hecho de que la mayor parte de las funciones de entrada/salida usan buffers intermedios. Para lograr que el mensaje llegue al proceso y no se estanque en buffers intermedios es necesario activar el modo autoflush .

Método Antiguo: La variable $|

El modo autoflush es controlado mediante la variable $| (véase perlvar). La variable sólo afecta al fichero de salida estándar actualmente seleccionado. Por tanto, para poner un fichero en modo autoflush se hace primero un select, se pone la variable $| a 1 y se vuelve a hacer un select del fichero anterior. La función select retorna el fichero actualmente seleccionado. Por ejemplo, para poner en modo autoflush el fichero F hacemos:

my $previousF = select(F); $| = 1; select($previousF);

Que normalmente se resume en la siguiente frase hecha (idiom):

select((select F, $| = 1)[0]);

Método Recomendado: El módulo IO::Handle

El método autoflush de un objeto IO::Handle permite cambiar su estado de flush :

use IO::Handle;

$F = new IO::Handle;
$F->autoflush(1);

Las Funciones sysread y syswrite

Las funciones sysread y syswrite posibilitan la entrada/salida sin el uso de buffers intermedios. Por ello su uso - cuando de procesos se trata - es mas conveniente que el de las correspondientes funciones de e/s con buffers.

El formato de sysread es:

      sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
      sysread FILEHANDLE,SCALAR,LENGTH

Se intenta una lectura del fichero FILEHANDLE de LENGTH bytes para escribirlos en el buffer SCALAR. No es buena idea mezclar la función con sus colegas con buffer: print, write, seek, tell y eof. Retorna el número de bytes que se pudieron leer.

El buffer SCALAR crece o se contrae para contener exactamente hasta el último byte leído. Si se especifica, el OFFSET dice en que lugar de SCALAR se colocan los datos leídos. Para saber que hemos llegado al final de la lectura compruebe que el número de bytes leídos es cero.

El formato de syswrite es:

     syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
     syswrite FILEHANDLE,SCALAR,LENGTH
     syswrite FILEHANDLE,SCALAR

Intenta escribir LENGTH bytes de SCALAR en FILEHANDLE saltándose los buffers de E/S. Si no se especifica LENGTH se escribe todo SCALAR.



Subsecciones
Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19