Bug #10781
closedstdout flushing and loops
Description
I'm making a little program that has a shell like command prompt. Something like:
$ cmd
Cmd out
$ more
More out
$
I tried the following code, but the second prompt does not get flushed to my terminal after entering an initial command:
begin
$stdout.write("$ ")
$stdout.flush
$stdout.puts($stdin.gets.inspect)
end until $stdin.closed? || $stdin.eof?
My output looks like:
$ input
"input\n"
more
$ "more\n"
But if I write my code like the following, my prompt works but I can't wrap my prompter in a method:
$stdout.print('$ ')
$stdout.flush
begin
$stdout.puts($stdin.gets.inspect)
$stdout.print('$ ')
$stdout.flush
end until $stdin.closed? || $stdin.eof?
end
What exactly is the problem here? I've tried a 1.8 and 1.9.3p547.
Updated by sneakin (Nolan Eakins) over 10 years ago
Removing the $stdin.eof?
call fixed my problem. IDK why as yet. I finally did find a page with a similar issue after seeing it was #eof? related at http://computer-programming-forum.com/39-ruby/0ce7591347ab1e27.htm
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Description updated (diff)
- Status changed from Open to Rejected
If ios is a stream such as pipe or socket,
IO#eof?
blocks until the other end sends some data or closes it.
This is true for a console device, and
Note that
IO#eof?
reads data to the input byte buffer.