2016-11-17 68 views
1

我有一个相当特殊的文件格式可以使用: 每行以其内容的校验和开头,后面跟着一个换行符。带文件功能的LD_PRELOAD

它看起来像这样:

[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机制来覆盖相关的文件功能。 我在https://zlibc.linux.lu/index.html上看到过类似zlibc的东西 - 解释了它是如何工作的(https://zlibc.linux.lu/zlibc.html#SEC8)。

但我没有明白。它们只取代文件打开功能。没有阅读。没有写信。没有fseek。没有。那么它是怎样工作的? 或者 - 我必须拦截哪些函数来处理这个文件上的每个读或写操作并相应地处理它们?

回答

1

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

可能的实现:

zlibc打开:

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

zlibc接近:

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

在这种情况下,你并不需要覆盖的读/写/等,因为你可以使用原有的。

在你的情况有两种可能的解决方案:

  1. open,使您的文件的副本条纹校验。 close计算校验和并覆盖原始文件
  2. readwrite可以跳过/计算校验和。

广告2. 从What is the difference between read() and fread()?

的fread()是C库的一部分,并提供缓冲的读取。它通常是 通过按顺序调用read(),以填补其缓冲

在这种情况下,我相信,覆盖openclose将是不容易出错,因为你可以放心地重用原来readwritefread实施,fseek

+0

这听起来像一个合理的做法。 我的假设是正确的,所有功能,如fopen,fclose,fgets,fputs,fread,fwrite等等都是库函数,使用你提到的系统调用? 像fseek和ftell这样的函数怎么样? 是否有任何其他系统调用我应该拦截以确保一切正常? –

+0

@DanielHeinrich:我更新了答案。 – woockashek