週刊mosh - サイズの無いfdの扱い

moshは移植の見回りフェーズ。特にLinuxNetBSDのような普段あんまり触らないところはまずい点が有りそうということで。

報告されたバグ

非同期シグナルでおかしくなるのは以前も有った気がするが。。

get-bytevector-allは、Portの指すfdのサイズを求めて、そのサイズ分だけreadしようとする。size()は終端がないリダイレクトやパイプに対しては失敗するので、そのようなfdを指すPortについてはget-bytevector-allは使えなくなる。

サイズの無いfdの扱い

moshにはfdを抽象化する層が基本的に終端のあるファイルしか想定していない。(例外的に、Socketは別のクラスを持っている)
これはmoshR6RSの上にデザインされていることに起因するように思える。R6RS Schemeで規定されているAPIは(stdin/out/errを除けば)ファイルのオープンとクローズだけなので、OSのインターフェースとしては"シーク可能で終端のある"ファイルしか取り扱えない。
OSのファイルAPIスクリプトにどう見せるかは難しい問題で、mmapのサポートやout-of-orderなI/O、lockなどのサポートを考えると、いわゆる標準libcのレベルでは全然機能が足りない。逆にR6RSやR7RS(small)では標準libcレベルしか標準化しないので、その辺の設計が処理系の差別化要素になるような気もしている。