再現コード
■popen.rb
io = IO.popen './test.exe', 'r+'
#io = IO.popen 'php test.php', 'r+'
#io = IO.popen 'ruby test.rb', 'r+'
while gets
 io.write $_
 print io.gets
end
io.close

■test.rb (標準入力から受け取り、大文字に変えて標準出力へ)
while gets
 print $_.upcase
end

■test.php (同じことをしていますが、PHPの場合だけうまくいきます)
<?php
while (! feof(STDIN)) {
 echo strtoupper(fgets(STDIN));
}

■test.cpp
ちょっと長くなるので省略しますが、cin.getlineやfgetsで受け取り、coutやprintfで返すと問題が再現します。
環境はWinXP、cl/14.00(g++やbccでも同じでした)、ruby/1.8.4、php/5.1.4です。

とにかくC++で作った実行ファイルをrubyからpopenして、標準入出力のフィルタリングのようなことをしたいので、どうか宜しくお願いします。