IPC (межпроцессное взаимодействие) является очень сложным. При работе с IPC необходимо очищать буфер после каждой операции записи. Это будет выглядеть так:
Open3.popen3("./server") do |stdin,stdout,stderr|
stdout.gets
stdin.puts "1"
stdin.flush
stdout.gets
stdin.puts "2"
stdin.flush
stdout.gets
end
Это ужасно, но вы можете переопределить puts
как одноэлементный метод для stdin
(вы можете сделать то же самое с print
и write
, если необходимо):
class <<stdin
old_puts=method(puts)
def puts(str)
old_puts[str]
flush
end
end
Это избавит вас от многих неприятностей, если вы делаете много IPC.