2016-11-17 101 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