虚拟化 C 的 FILE* 接口的可行性如何?
How feasible is it to virtualise the FILE* interfaces of C?
我经常注意到,如果有一种方法可以创建“虚拟 FILE
”并为缓冲区已满等事件附加必要的回调,我就可以优雅地解决 C 中的实际问题,输入请求,关闭,刷新。然后应该可以使用大部分 stdio.h
功能,例如fprintf
不变。 是否有一个框架可以让人们做到这一点?如果不是,是否可以通过适度的努力至少在某些平台上实现?
可能的应用是:
- 写入动态或静态内存区域或从中读取。
- 并行写入多个文件。
- 从线程或协程生成数据中读取。
- 将过滤器应用于另一个(虚拟或真实)
FILE
。
- 支持间接文件格式(如
#include
)。
- A C 预处理器(?)。
我对特定案例的解决方案比对让您自己动手的框架更感兴趣 FILE
。我也不是在寻找虚拟文件系统,而是我可以传递给 CRT 的虚拟 FILE*
s。
令我失望的是,我从未见过这样的东西;据我所知,C11 认为 FILE
完全取决于语言实现者,如果希望保持语言(+库)规范较小,这可能是合理的,但如果将其与 Java I/O 流。
我确信虚拟 FILE
s 必须可以用于 C 运行-time 的任何(完全)开源实现,但我想可能会有大量细节它比看起来更棘手,如果已经完成,重复工作将是一种耻辱。最好不要修改 CRT 代码。如果没有开源,人们可能能够对所提供的功能进行逆向工程,但我担心结果很容易受到不受支持的功能的更改的影响,除非承诺提供一组接口。我也认为任何可以为其编写设备驱动程序的系统都允许创建虚拟设备,但我怀疑这是不必要的低级并且需要一个人编写特权代码。
我不得不承认,虽然我的代码可以从虚拟 FILE
s 中获益,但我目前对它没有要求;尽管如此,这是我经常想知道的事情,我想其他人可能会感兴趣。
这个有点类似a-reader-interface-that-consumes-files-and-char-in-c,但是提问者那里没有希望return虚FILE
;然而,使用 fmemopen
的答案确实如此。
没有用于创建虚拟 FILE* 的标准 C 接口,但 GNU 和 BSD 标准库都包含一个。在 linux (glibc) 上,您可以使用 fopencookie; on most *BSD systems, funopen (including Mac OS X)。 (见注1)
两个界面相似,但在一些细节上略有不同。但是,将为一种界面编写的代码改编为另一种界面通常非常简单。
这些不是完整的虚拟化。他们将 FILE*
与四个回调和一个 void*
上下文相关联(fopencookie
中的 "cookie")。回调是read
、write
、seek
和close
; flush
或 tell
操作没有回调。尽管如此,这对于许多简单的 FILE*
适配器来说已经足够了。
有关简单示例,请参阅 Write simultaneousely to two streams 的两个答案。
备注:
funopen
派生自 "functional open",而不是 "file unopen".
我经常注意到,如果有一种方法可以创建“虚拟 FILE
”并为缓冲区已满等事件附加必要的回调,我就可以优雅地解决 C 中的实际问题,输入请求,关闭,刷新。然后应该可以使用大部分 stdio.h
功能,例如fprintf
不变。 是否有一个框架可以让人们做到这一点?如果不是,是否可以通过适度的努力至少在某些平台上实现?
可能的应用是:
- 写入动态或静态内存区域或从中读取。
- 并行写入多个文件。
- 从线程或协程生成数据中读取。
- 将过滤器应用于另一个(虚拟或真实)
FILE
。 - 支持间接文件格式(如
#include
)。 - A C 预处理器(?)。
我对特定案例的解决方案比对让您自己动手的框架更感兴趣 FILE
。我也不是在寻找虚拟文件系统,而是我可以传递给 CRT 的虚拟 FILE*
s。
令我失望的是,我从未见过这样的东西;据我所知,C11 认为 FILE
完全取决于语言实现者,如果希望保持语言(+库)规范较小,这可能是合理的,但如果将其与 Java I/O 流。
我确信虚拟 FILE
s 必须可以用于 C 运行-time 的任何(完全)开源实现,但我想可能会有大量细节它比看起来更棘手,如果已经完成,重复工作将是一种耻辱。最好不要修改 CRT 代码。如果没有开源,人们可能能够对所提供的功能进行逆向工程,但我担心结果很容易受到不受支持的功能的更改的影响,除非承诺提供一组接口。我也认为任何可以为其编写设备驱动程序的系统都允许创建虚拟设备,但我怀疑这是不必要的低级并且需要一个人编写特权代码。
我不得不承认,虽然我的代码可以从虚拟 FILE
s 中获益,但我目前对它没有要求;尽管如此,这是我经常想知道的事情,我想其他人可能会感兴趣。
这个有点类似a-reader-interface-that-consumes-files-and-char-in-c,但是提问者那里没有希望return虚FILE
;然而,使用 fmemopen
的答案确实如此。
没有用于创建虚拟 FILE* 的标准 C 接口,但 GNU 和 BSD 标准库都包含一个。在 linux (glibc) 上,您可以使用 fopencookie; on most *BSD systems, funopen (including Mac OS X)。 (见注1)
两个界面相似,但在一些细节上略有不同。但是,将为一种界面编写的代码改编为另一种界面通常非常简单。
这些不是完整的虚拟化。他们将 FILE*
与四个回调和一个 void*
上下文相关联(fopencookie
中的 "cookie")。回调是read
、write
、seek
和close
; flush
或 tell
操作没有回调。尽管如此,这对于许多简单的 FILE*
适配器来说已经足够了。
有关简单示例,请参阅 Write simultaneousely to two streams 的两个答案。
备注:
funopen
派生自 "functional open",而不是 "file unopen".