【问题标题】:Read data in executable on run在运行时读取可执行文件中的数据
【发布时间】:2011-08-19 18:38:44
【问题描述】:

节日快乐!

我有一个可执行文件(Unix 或 Windows - 它应该是交叉编译的)。如果一个人用任何编辑器打开这个可执行文件并在最后写一些东西——应用程序仍然可以完美运行。 在执行时,应用程序及其所有数据都加载到 RAM 中。因此,文件的用户写入部分也被加载到内存中。

有没有机会读取这些数据?

我需要快速访问这些数据。其他变通方法不行,因为太费时间了:

  1. 直接从文件(在硬盘上)读取或映射它是不行的,因为应用程序必须在每次运行时读取这个文件,但是这个应用程序每秒有很多启动。
  2. 将共享内存与另一个进程(如服务器,保存数据)一起使用不是交叉编译
  3. 在应用程序和所谓的服务器之间使用管道不够快,恕我直言。

这就是为什么我决定在应用程序的末尾写一些东西。

提前致谢!

【问题讨论】:

  • 我不舒尔,所以只有一个评论:你不应该做这样的事情。操作构建可执行文件并在末尾添加一些数据可能会损坏您的二进制文件。您应该创建一个额外的数据文件。根据数据的类型,您应该在启动时将文件作为资源打开并将内容存储到内存中。或者您必须将数据编译到可执行文件中。
  • Thomas,将数据添加到末尾不会损坏二进制文件本身。使用额外的文件非常耗时。存储的数据基本上是普通的文本。
  • “耗时”是什么意思?这就是世界其他地方所做的!此外,这对代码签名等也有影响。
  • @serenheit 使用文本编辑器(在最坏的情况下,Windows 上的记事本)编辑二进制文件会损坏二进制文件。你不应该做那样的事情。不使用文本编辑器
  • @Joe 耗时意味着读取文件需要大约 50% 的程序工作时间。这部分必须非常快,因为我有一个服务器对这个二进制文件有很多请求。

标签: c++ c ram


【解决方案1】:

你在重新发明吗

我还认为您可能正在优化错误的内容。

直接从文件(在硬盘上)读取或映射它是不行的,因为应用程序必须在每次运行时读取这个文件,但是这个应用程序每秒有很多启动。

内核[1] 比我们聪明方式,并且完全能够缓存映射的内容。哎呀,如果您以只读方式映射它,则与直接从程序的基础映像访问数据将没有区别。

[1]:这适用于 WIndows 和 Unix

【讨论】:

  • 如果我没记错的话,我在进程开始时映射文件,之后,最后,我必须取消映射它。我认为内核不会缓存它。但是..这可能是方式。我会试着找到一些关于..的信息。
  • @serenheit 内核会缓存它,这就是它有文件系统缓存的原因
  • @serenheit 在读取文件方面。二进制文件中的映射与文件系统缓存无关
  • @Thomas 该文件将被缓存,下次我读取它时,它会从缓存中加载吗?映射是否正确?
  • 无论映射还是读取,都有块缓存。实际块已经在 RAM 中,因此它们只是重新映射到进程空间(并且共享 IFF 映射是只读的)。除非文件更改,否则重新打开同一个地图不需要磁盘访问。
猜你喜欢
  • 2021-12-02
  • 2020-02-27
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多