週刊mosh - サイズの無いfdの扱い
moshは移植の見回りフェーズ。特にLinuxやNetBSDのような普段あんまり触らないところはまずい点が有りそうということで。
報告されたバグ
- http://code.google.com/p/mosh-scheme/issues/detail?id=228
- SIGPIPEを受け取ると事件が起こる
非同期シグナルでおかしくなるのは以前も有った気がするが。。
- http://code.google.com/p/mosh-scheme/issues/detail?id=229
- get-bytevector-allがサイズの無いオブジェクトに対して使えない
get-bytevector-allは、Portの指すfdのサイズを求めて、そのサイズ分だけreadしようとする。size()は終端がないリダイレクトやパイプに対しては失敗するので、そのようなfdを指すPortについてはget-bytevector-allは使えなくなる。
サイズの無いfdの扱い
moshにはfdを抽象化する層が基本的に終端のあるファイルしか想定していない。(例外的に、Socketは別のクラスを持っている)
これはmoshがR6RSの上にデザインされていることに起因するように思える。R6RS Schemeで規定されているAPIは(stdin/out/errを除けば)ファイルのオープンとクローズだけなので、OSのインターフェースとしては"シーク可能で終端のある"ファイルしか取り扱えない。
OSのファイルAPIをスクリプトにどう見せるかは難しい問題で、mmapのサポートやout-of-orderなI/O、lockなどのサポートを考えると、いわゆる標準libcのレベルでは全然機能が足りない。逆にR6RSやR7RS(small)では標準libcレベルしか標準化しないので、その辺の設計が処理系の差別化要素になるような気もしている。