Tengo un script Perl que usa una herramienta externa (cleartool) para reunir información sobre una lista de archivos. Quiero usar IPC para evitar genere un nuevo proceso para cada archivo:¿Cómo hago una lectura de IPC sin bloqueo en Windows?
use IPC::Open2;
my ($cin, $cout);
my $child = open2($cout, $cin, 'cleartool');
comandos que devuelven esquemas eléctricos funcionan bien. p.ej.
print $cin "describe -short $file\n";
my $description = <$cout>;
comandos que devuelven varios líneas me tienen en un callejón sin salida para la forma de consumir toda la respuesta sin quedar atrapado por un bloqueo de lectura:
print $cin "lshistory $file\n";
# read and process $cout...
He tratado de establecer el gestor de archivo de sin bloqueo lee a través de fcntl
:
use Fcntl;
my $flags = '';
fcntl($cout, F_GETFL, $flags);
$flags |= O_NONBLOCK;
fcntl($cout, F_SETFL, $flags);
pero Fcntl muere con el mensaje "Su proveedor no ha definido Fcntl macro F_GETFL."
He intentado usar IO :: Handle para establecer $cout->blocking(0)
pero eso falla (devuelve undef
y establece $!
en "Error desconocido").
He intentado utilizar select
para determinar si hay datos disponibles antes de intentar leer:
my $rfd = '';
vec($rfd, fileno($cout), 1) = 1;
while (select($rfd, undef, undef, 0) >= 0) {
my $n = read($cout, $buffer, 1024);
print "Read $n bytes\n";
# do something with $buffer...
}
pero que cuelga, sin leer nada. ¿Alguien sabe cómo hacer que esto funcione (en Windows)?
¿Qué planea hacer sin bloquear en IO? – jrockway
Quiero leer hasta que deje de obtener datos, lo que parece ser más confiable que intentar determinar que he llegado al final analizando los datos que ya recuperé. (No hay indicación de "esta es la última línea" en los datos). –
Buscando un problema relacionado, encontré este compromiso en GitHub, que parece invocar magia negra para hacer un socket no bloqueante: https: // github .com/kthakore/frozen-bubble/commit/735dd2307455e32c69827e013992c2d022cb7347 –