我有一个软件(C/C++/Linux),由三个服务组成,使用
tmpfs
文件作为共享内存。为了方便起见,我们ftruncate
将文件设置为 1GB,但实际上该文件仅包含不超过 500MB 的数据,因此超过 50% 的文件末尾都是一个大的零填充孔。
该软件提供了一个名为
download
的工具,允许用户获取自己的文件离线副本。在进行该复制时,我不希望用户看到它占用了 1GB,而是删除了“尾随孔”。我们不需要一直跟踪“实际大小”,我更喜欢仅在用户要求下载时才知道或“推断”大小,这是一个相当不常见的操作。我希望系统能帮我找出答案。
以下任何一种方法对我来说就足够了:
system("blabla")
调用,而我更喜欢调用 C 函数。我怎样才能做到这一点?我更喜欢使用系统调用或 libc,如果没有合适的方法来做到这一点,那么可以使用命令行工具作为替代方案。不能使用第三方 C/C++ 库。
您可以通过一系列带有
lseek
和 SEEK_HOLE
标志的 SEEK_DATA
来探索文件中的漏洞,这些标志将带您到下一个漏洞/非漏洞。
这些标志在 Linux 3.1+ 以及某些 BSD 上可用。