【问题标题】:Is it possible to fake a file stream, such as stdin, in C?是否可以在 C 中伪造文件流,例如标准输入?
【发布时间】:2015-02-27 17:32:47
【问题描述】:

我正在开发一个没有文件系统的嵌入式系统,我需要执行从通过命令(如参数)或直接从标准输入指定的文件中获取输入数据的程序。

我知道可以使用以下答案中的方法将文件数据与二进制文件一起烘焙:C/C++ with GCC: Statically add resource files to executable/library,但目前我需要重写所有程序才能以新的方式访问数据。

例如,是否可以嵌入一个文本文件,并在运行程序时使用指向标准输入的假文件指针访问它?

【问题讨论】:

  • 好吧,如果你有它,你应该可以使用fmemopen,但它有点像linux特定的东西。
  • 需要文件的特定程序有哪些?
  • @Petesh: fmemopen 是一个 POSIX 函数
  • @BasileStarynkevitch 是的,只是碰巧我之前检查的两个系统没有它(OSX,Solaris)
  • 更多关于你的执行环境的信息,一个工具链会很有帮助。特别是您使用的是什么 C 库(例如 GNU、newlib、uclib)。

标签: c file-io embedded


【解决方案1】:

如果您的系统是无操作系统的裸机系统,那么您的 C 库将具有“重定向”存根或挂钩,您需要实施这些存根或挂钩以将库挂钩到平台。这通常包括低级 I/O 函数,例如 open()、read()、write()、seek() 等。您可以根据需要实现这些,以实现基本的 stdin、stdout、stderr 流(在 POSIX和大多数其他实现,它们将分别具有固定的文件描述符 0、1 和 2,并且不需要显式打开)、文件 I/O,在这种情况下用于管理任意内存块。

open() 例如,将传递一个文件或设备名称(该字符串可以按您希望的任何方式解释),并将返回一个文件描述符。您可能会将“cfgdata:”识别为访问“内存文件”的设备名称,并且您将返回一个唯一的描述符,然后将其传递给read()。您使用描述符来引用数据以管理流;可能比读取字符时按数字递增的索引多一点。 seek() 实现可以直接设置相同的索引。

一旦您实现了这些功能,更高级别的 stdio 功能甚至 C++ iostream 将在您在低级别实现中支持的设备或文件系统上正常工作。

【讨论】:

    【解决方案2】:

    正如评论,您可以使用 POSIX fmemopen 函数。你需要一个提供它的 libc,例如musl-libc 或可能是 glibc。顺便说一句,出于基准测试的目的,您可能会在您的硬件上安装一些类似 Linux 的小型操作系统,例如uclinux

    【讨论】:

    • 安装操作系统不是一个选项,我会尝试 fmemopen。谢谢。
    • uCLinux Linux并且不是很小。
    • @BasileStarynkevitch :确实,但 uCLinux 的主要技巧是在没有 MMU 的情况下运行 Linux(可以说会破坏 Linux 的大部分优势!)而不是在小空间中运行(例如,与 4Mb 的 RAM 相比变化不大) .为嵌入式 C 库实现 I/O 存根以支持文件/流 I/O 很简单,只需要几百个字节。在这种情况下,这可能是一个大锤。
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2015-12-25
    • 2013-04-06
    • 2017-01-19
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多