From: Tanaka Akira Date: 2012-06-09T12:30:11+09:00 Subject: [ruby-dev:45714] Re: [ruby-trunk - Feature #6440][Open] 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい 2012年5月17日 18:21 Tanaka Akira : > バッファがあると、読みすぎることがあるのではないでしょうか。 > > 読みすぎたぶんを捨ててしまうと、 > marshal したデータが複数並んでいるものを読み込む場合に、 > 動作しなくなってしまうと思います。 > 個人的に最近作っている tb というもので、この動作を利用しているので、 > 気になるところです。 気がついたので記録のために書いておきますが、marshal の load が読みすぎないという 性質を process.c でも利用しているようです。 rb_fork_err で、子プロセスの例外を marshal で読み出し、次に errno を読み出し、 エラーメッセージを読み出す、というようなことをやっています。 if ((read(ep[0], &state, sizeof(state))) == sizeof(state) && state) { io = rb_io_fdopen(ep[0], O_RDONLY|O_BINARY, NULL); exc = rb_marshal_load(io); rb_set_errinfo(exc); } #define READ_FROM_CHILD(ptr, len) \ (NIL_P(io) ? read(ep[0], (ptr), (len)) : rb_io_bufread(io, (ptr), (len))) if ((size = READ_FROM_CHILD(&err, sizeof(err))) < 0) { err = errno; } if (size == sizeof(err) && errmsg && 0 < errmsg_buflen) { ssize_t ret = READ_FROM_CHILD(errmsg, errmsg_buflen-1); if (0 <= ret) { errmsg[ret] = '\0'; } } のあたりです。 -- [田中 哲][たなか あきら][Tanaka Akira]