我想要的东西看起来像文件句柄,但实际上是由内存缓冲区支持用于I / O重定向。我怎么能这样做?
答案 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)
这实际上是图书馆设计中的一个错误,也让我感到烦恼。我看到了两种做你想做的事情的方法,这两种做法都不是很有吸引力。
创建一个新的类型类,使当前句柄成为它的一个实例,编写另一个实例来执行内存数据事务,并更改所有需要使用此工具的程序。这可能就像导入System.SIO
(或任何你想要的名称)而不是System.IO
一样简单。但是,如果您在Data.ByteString
等库中使用自定义I / O例程,那么还有更多工作要做。
重写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是一种抽象数据类型,而不是类型类。