Ruby で次のようなコードを書いたらエラーが出た。

pin, pout = IO.pipe
Process.fork do
  pin.close
  pout.puts Marshal.dump(265)
  pout.puts Marshal.dump(266)
  pout.puts Marshal.dump(267)
  pout.close
end

pout.close
puts Marshal.load(pin.gets)  # OK
puts Marshal.load(pin.gets)  # `load': marshal data too short (ArgumentError)
puts Marshal.load(pin.gets)  # OK
pin.close

これは、266 を Marshal dump した値に改行文字が含まれているのが原因。

$ irb
ruby-1.9.2-p290 :002 > Marshal.dump(266)
 => "\x04\bi\x02\n\x01"

正しくはこうする。

pin, pout = IO.pipe

Process.fork do
  pin.close
  pout.write Marshal.dump(265)
  pout.write Marshal.dump(266)
  pout.write Marshal.dump(267)
  pout.close
end

pout.close
puts Marshal.load(pin)  # OK
puts Marshal.load(pin)  # OK
puts Marshal.load(pin)  # OK
pin.close