如何在Haskell中创建内存中句柄?

时间:2008-09-13 14:30:08

标签: file-io haskell io

我想要的东西看起来像文件句柄,但实际上是由内存缓冲区支持用于I / O重定向。我怎么能这样做?

6 个答案:

答案 0 :(得分:19)

我刚刚编写了一个提供此功能的库,名为“knob”[hackage]。您可以使用它来创建引用/修改Handle的<{1}}:

ByteString

答案 1 :(得分:3)

如果您可以在C或系统调用方面表达您想要做的事情,您可以使用Haskell的外部函数接口(FFI)。我开始建议使用mmap,但第二个想法我认为mmap可能是一个错误的映射方式,即使你将它与匿名选项一起使用。

您可以在haskell.org wiki上找到有关Haskell FFI的更多信息。

答案 2 :(得分:1)

这可能是不可能的。至少,GHC似乎需要一个句柄来拥有一个用于所有读/写/搜索操作的OS文件描述符。

请参阅GHC来源的/libraries/base/IOBase.lhs

您可以通过征求操作系统的帮助获得相同的效果:创建一个临时文件,将句柄连接到它,然后内存映射文件以进行I / O重定向。这样,所有句柄I / O都将在内存映射部分中可见。

答案 3 :(得分:1)

这实际上是图书馆设计中的一个错误,也让我感到烦恼。我看到了两种做你想做的事情的方法,这两种做法都不是很有吸引力。

  1. 创建一个新的类型类,使当前句柄成为它的一个实例,编写另一个实例来执行内存数据事务,并更改所有需要使用此工具的程序。这可能就像导入System.SIO(或任何你想要的名称)而不是System.IO一样简单。但是,如果您在Data.ByteString等库中使用自定义I / O例程,那么还有更多工作要做。

  2. 重写I / O库以扩展它们以支持此功能。这不是一件容易的事,也不是很多工作,但要做的工作并不是特别困难。但是,对于没有此库的系统,您会遇到兼容性问题。

答案 4 :(得分:-1)

要为此问题添加现代答案,您可以使用createPipe中的System.Process

createPipe :: IO (Handle, Handle)

https://www.stackage.org/haddock/lts-10.3/process-1.6.1.0/System-Process.html#v:createPipe

答案 5 :(得分:-3)

如果不修改编译器,这是不可能的。这是因为Handle是一种抽象数据类型,而不是类型类。