鑑於我希望從長命令中測試非阻塞讀取,我創建了以下腳本,將其保存爲long
,使其可執行文件爲chmod 755
,並將其放置在我的路徑中(保存爲~/bin/long
,其中~/bin
位於我的路徑中)。爲什麼IO :: WaitReadable對STDOUT的提升與STDERR不同?
我處於* nix變體,ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-darwin11.0.0]
編譯爲RVM默認值。我不使用Windows,因此如果你這樣做,我不確定測試腳本是否適用於你。
#!/usr/bin/env ruby
3.times do
STDOUT.puts 'message on stdout'
STDERR.puts 'message on stderr'
sleep 1
end
爲什麼long_err
產生每個STDERR消息,因爲它是由
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
而long_out
保持阻塞,直到所有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
我假設你在測試任何函數之前都會require 'open3'
。
爲什麼IO::WaitReadable
對STDOUT的提升與STDERR不同?
使用other ways to start subprocesses的變通辦法也讚賞,如果你有他們。
非常感謝卡斯帕,我會盡快達到15位代表 –