2008-09-13 15 views
13

私はファイルハンドルのように見えるが、実際にはI/Oリダイレクトに使用するメモリ内バッファがある。これどうやってするの?Haskellでメモリ内ハンドルを作成するにはどうすればよいですか?

+0

にあなたはこの質問に再訪したい場合は、新しい回答があります。 –

+0

@Peter Mortensenそれは、Johnの答えがまさにあなたが望むものだと思われます。 – PyRulez

答えて

0

コンパイラを変更しないとできません。これは、ハンドルが抽象データ型であり、型クラスではないためです。

+0

すべての答えをありがとう。私は実際に私が知りませんでしたこれを行う慣用のハスケルの方法があるかどうかを知りたかったので、この答えは私を訴えます。 – airportyh

1

これは可能でない場合があります。 GHCは、少なくとも、すべての読み取り/書き込み/シーク操作に使用されるOSファイル記述子を持つハンドルを必要とするようです。

GHCソースから/libraries/base/IOBase.lhsを参照してください。

OSのヘルプを登録することで、同じ効果が得られる場合があります。一時ファイルを作成し、そのファイルにハンドルを接続し、I/Oリダイレクトのファイルをメモリマップします。このようにして、すべてのハンドルI/Oがメモリーマップセクションに表示されます。

3

あなたがCまたはシステムコールに関して何をしたいかを表現できるなら、HaskellのFFI(Foreign Function Interface)を使うことができます。私はmmapの使用を提案しましたが、2番目の考えでは、匿名のオプションで使用したとしても、mmapが誤ったマッピングになるかもしれないと思います。

ハスケルFFIの詳細については、haskell.org wikiを参照してください。

1

これは実際にはライブラリデザインのバグであり、私にとっても迷惑なものです。私はあなたがしたいことをするために2つのアプローチを見ていますが、どちらもひどく魅力的ではありません。

  1. 新しい型クラスを作成し、現在はそのインスタンスを扱う作る、インメモリ・データのことを行うために別のインスタンスを作成して、この機能を使用する必要があり、あなたのすべてのプログラムを変更します。これはSystem.IOの代わりにSystem.SIO(またはそれを呼び出したいもの)をインポートするのと同じくらい簡単です。しかし、Data.ByteStringなどのライブラリでカスタムI/Oルーチンを使用すると、そこで実行する必要があります。

  2. I/Oライブラリを拡張してサポートするように書き換えます。自明ではなく、多くの作業がありますが、特に困難な作業ではありません。しかし、このライブラリを持たないシステムとの互換性の問題があります。

19

これを提供するライブラリを「ノブ」[hackage]と書いたばかりです。あなたはSystem.ProcessからcreatePipeを使用することができ、

import Data.ByteString (pack) 
import Data.Knob 
import System.IO 

main = do 
    knob <- newKnob (pack []) 
    h <- newFileHandle knob "test.txt" WriteMode 
    hPutStrLn h "Hello world!" 
    hClose h 
    bytes <- Data.Knob.getContents knob 
    putStrLn ("Wrote bytes: " ++ show bytes) 
関連する問題