Dado que deseo probar lecturas sin bloqueo desde un comando largo, creé el siguiente script, lo guardé como long
, lo hice ejecutable con chmod 755
, y lo coloqué en mi ruta (guardado como ~/bin/long
donde está en mi ruta ~/bin
)¿Por qué IO :: WaitReadable se plantea de forma diferente para STDOUT que STDERR?
Estoy en una variante * nix con ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.0.0]
compilado con los valores predeterminados RVM. No uso Windows, y por lo tanto no estoy seguro si el script de prueba funcionará para usted si lo hace.
#!/usr/bin/env ruby
3.times do
STDOUT.puts 'message on stdout'
STDERR.puts 'message on stderr'
sleep 1
end
¿Por qué long_err
producen cada mensaje STDERR ya que es impreso por "largo"
def long_err(bash_cmd = 'long', maxlen = 4096)
stdin, stdout, stderr = Open3.popen3(bash_cmd)
begin
begin
puts 'err -> ' + stderr.read_nonblock(maxlen)
end while true
rescue IO::WaitReadable
IO.select([stderr])
retry
rescue EOFError
puts 'EOF'
end
end
mientras long_out
permanece bloqueado hasta que se imprimen todos los mensajes STDOUT?
def long_out(bash_cmd = 'long', maxlen = 4096)
stdin, stdout, stderr = Open3.popen3(bash_cmd)
begin
begin
puts 'out -> ' + stdout.read_nonblock(maxlen)
end while true
rescue IO::WaitReadable
IO.select([stdout])
retry
rescue EOFError
puts 'EOF'
end
end
Asumo que se require 'open3'
antes de probar cualquiera de las funciones.
¿Por qué IO::WaitReadable
se plantea de forma diferente para STDOUT que STDERR?
También se agradecieron las soluciones provisionales usando other ways to start subprocesses si las tiene.
Gracias Casper, se votará tan pronto como llegue a 15 rep. –