require 'thread'
require 'time'
require 'find'

read, write = IO.pipe

# 子プロセス処理
fork do
  testArray = Array.new
  inArray = {
      :id                 => 1000,
      :type               => "A"
  }
  testArray << inArray
  testArray << inArray

  # 子プロセスで読み出さないのでクローズ
  read.close
  loop do
      str = Marshal.dump(testArray)
      write.puts str
#      write.close
      sleep 5
  end

  write.close
end

# 親プロセス処理
# 親から書き込まないのでクローズ
write.close
Thread.new do
  loop do
    read.read
    result = Marshal.load(message)
  end

end

# プロセス処理終了待ち
Process.waitall

forkを勉強中です。
子プロセスから親プロセスにデータを渡したいと思っています。
親側でIO.pipeを作成し、子でシリアライズしたデータを親に繰り返し送ろうとしています。
繰り返し(loop do)処理がない場合、write.closeを子でおこなうことで
親側で値を取得できました。
繰り返し通知したい場合、「write.close」を行うと「write.puts」でエラーとなるため、
「write.close」をコメントアウトすると、「read.read」ができない状態となったため、
子プロセスの処理を

  read.close
  loop do
      str = Marshal.dump(testArray)
      write.puts str + 'end'★
      sleep 5
  end

親プロセス処理を

  loop do
    read.read
    while message = read.gets('end')★
      message.delete('end')★
      results = Marshal.load(message)
    end
  end

このようにしたところ、
子からの書込み1回目は成功し、
二回目は、以下まではくるももの、 Marshal.load以降が処理されません。
message.delete('end')★

書込みや読み込みを繰り返し実施する場合、そもそもこのような作りではないのでしょうか?