LD_PRELOAD 具有文件功能

LD_PRELOAD with file functions

我有一种相当特殊的文件格式可以使用: 每行都以其内容的校验和开头,后跟换行符。

看起来像这样:

[CHECKSUM OF LINE_1][LINE_1]\n
[CHECKSUM OF LINE_2][LINE_2]\n
[CHECKSUM OF LINE_3][LINE_3]\n
...

我的目标:允许任何应用程序像处理任何其他文本文件一样处理这些文件 - 不知道每行开头的附加校验和。

因为我在一台装有 debian wheezy(内核 3.18.26)的 linux 机器上工作,所以我想使用 LD_PRELOAD-mechanism 来覆盖相关的文件函数。 我在 https://zlibc.linux.lu/index.html - with an explanation of how it works ( https://zlibc.linux.lu/zlibc.html#SEC8 上用 zlibc 看到过类似的东西。

但是我不明白。它们仅替换文件打开功能。没有阅读。不写。没有fseek。没有什么。那么它是怎样工作的? 或者 - 我必须拦截哪些函数来处理对该文件的每个读取或写入操作并相应地处理它们?

我没有确切地检查它是如何工作的,但原因似乎很简单。

可能的实现:

zlibc 打开:

  1. 解压你想打开的文件到一些临时文件
  2. 打开这个临时文件而不是你的

zlibc 关闭:

  1. 压缩临时文件
  2. 覆盖原始文件

在这种情况下,您不需要覆盖 read/write/etc,因为您可以使用原始的。

对于您的情况,您有两种可能的解决方案:

  1. open,使用条带化校验和制作文件副本。 close 计算校验和并覆盖原始文件
  2. readwrite 能够 skip/calculate 校验和。

广告 2。 来自 What is the difference between read() and fread()?

fread() is part of the C library, and provides buffered reads. It is usually implemented by calling read() in order to fill its buffer

在这种情况下,我相信重写 openclose 会更不容易出错,因为您可以安全地重用原始 readwritefread, fseek