From: KOSAKI Motohiro Date: 2010-02-11T20:43:57+09:00 Subject: [ruby-dev:40398] Re: [Bug:trunk] TCPServer#gets gets stuck kosakiです。 >>> やるとしたら、io_read の中の READ_CHECK の直後だけでチェックしても >>> だめで、buffer string に書こうとする直前で毎回チェックする必要が >>> あると思いますが、IO のパフォーマンスが下がりそうなのでそこまでする >>> 必要があるかどうかはわかりません。 >> >> EFAULT のケースだと、buffer string に書くのは read システムコールなので、 >> カーネルが EFAULT で済ましてくれるというのを期待することになりますね。 >> システムコールを発行する前にはメモリはちゃんとあって検査のしようがないし。 >> それでは済まない OS が無いことを期待する、ということになりますかね。 > > そうでした。io_fread の中でチェックしてもダメですね。 > > EFAULT ってどのくらいあてになるんでしょうね。read 発行直後はちゃんと > バッファがあったけど、ブロック中に別スレッドが free/realloc したなんて > のも助けてくれるのかなあ。 ちゃんと調べずに書いていますが、カーネル屋さんの基本思想としては、あるプロセスがアホの子の時に そのプロセスが死ぬのを防ぐ必要はないと考えています。memcpyの引数間違えただけでSIGSEGVする こんな世の中じゃカーネルだけ頑張ってチェックしてもあんまり価値ないし。 もちろん、ミスるとカーネルとか他プロセスに被害が出そうな場合は厳密にやりますが。 そういうわけで、広い世の中きっとSEGVするOSはあるんじゃないかなぁ