All,
I'm writing a chess program that has a simple text-based interface. It's
designed to be run by another program, which has a nice UI. Here's the
program as it stands now, whittled to the simplest possible use case:

i = 0
moves = ["a7a6","a6a5","a5a4","a4a3"]
$stdin.each do |command|
  if command.start_with?("protover")
    $stdout.puts "feature ping=0 setboard=1 ics=1 usermove=1"
  elsif command.start_with?("usermove")
    $stdout.puts "move #{moves[i]}"
    i+=1
  end
  $stdout.flush
end

The "protover" thing is needed to tell the UI program how to initialize the
protocol, and then every time a move is made, the UI program sends
"usermove <some move>" to my program, which responds with "move <my move>".

If I run this by itself, I can happily enter a few 'usermove' commands
manually, and get any number of canned moves back. However, when I run this
under the UI, I get an Interrupt:

bin/winboard.rb:3:in `each': Interrupt
from bin/winboard.rb:3:in `<main>'

I know that the UI program is pretty reliable, so I'm missing something in
the way that I'm handling IO buffering or something. If you want the nitty
gritty details, you can see them at
http://www.gnu.org/software/xboard/engine-intf.html . I'm running on
MacOSX. Any suggestions?