是否可以在 C 中伪造文件流,例如 stdin?

Is it possible to fake a file stream, such as stdin, in C?

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

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

是否可以内置文本文件,并在 运行 程序时使用指向 stdin 的假文件指针访问它?

如评论所述,您可以使用 POSIX fmemopen function. You'll need a libc providing it, e.g. musl-libc or possibly glibc. BTW for benchmarking purposes you might install some tiny Linux-like OS on your hardware, e.g. uclinux

如果您的系统是 OS-less 裸机系统,那么您的 C 库将具有 "retargetting" 存根或挂钩,您需要实现这些存根或挂钩才能将库挂接到平台。这通常包括低级 I/O 函数,例如 open()、read()、write()、seek() 等。您可以根据需要实现这些基本标准输入、标准输出, stderr 流(在 POSIX 和大多数其他实现中,它们将分别具有固定的文件描述符 0、1 和 2,并且不需要显式打开),文件 I/O 并且在这种情况下为管理任意内存块。

例如,

open() 将传递一个文件或设备名称(字符串可以按您希望的任何方式解释),并且 return 将传递一个文件描述符。您可能会将 "cfgdata:" 识别为访问您的 "memory file" 的设备名称,并且您会 return 一个唯一的描述符,然后将其传递到 read()。您使用描述符来引用数据以管理流;可能只是一个索引,如果读取字符,该索引会增加数字。 seek() 实现可以直接设置相同的索引。

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