Linux 32和64位平台下支援LFS

2021-08-26 04:33:09 字數 1999 閱讀 4986

在linux x86(32位)系統上編譯的程式放到linux x86_64(64位)系統上執行的時候出現呼叫lstat或lstat函式的錯誤,返回的錯誤碼值為75,錯誤描述為「value too large for defined data type」。

為了讓程式能夠使用lfs(大檔案系統),你可以選擇使用下面的方法:使用gcc -d_file_offset_bits=64重新編譯程式,這會強制都使用64位版本的系統呼叫來訪問所有的檔案。這也將改變幾種資料型別,例如:off_t變為off64_t,stat變為stat64_t。因此,總是使用正確的資料型別而不使用例如int替代off_t是非常重要的。為了滿足其它平台下的可移植性,你應該使用getconf lfs_c***as獲取編譯選項。在linux平台上它會返回-d_file_offset_bits=64選項,但也可能返回_efile_source和_largfile64_source。使用這些定義,你可以直接使用lfs函式,例如open64,lstat64,fstat64,creat64等。使用o_largefile標誌開啟檔案,對lfs進行操作。執行info libc 「feature test macros」可以得到特徵測試巨集的完整文件說明。

備註:在中有如下的巨集定義。

#if defined _file_offset_bits && _file_offset_bits == 64

# define __use_file_offset64 1

#endif

補充說明:

在程式中使用stat,fstat和lstat函式檢查檔案的屬性。他們在stat結構中返回屬性的資訊(stat結構)。所有三個函式在標頭檔案中宣告。

stat函式在指向buf的stat結構中返回關於filename檔案屬性的資訊。如果filename是符號鏈結,你獲得的描述檔案的屬性就是鏈結所指向檔案的屬性。如果鏈結指向乙個不存在的檔案,那麼stat呼叫失敗,並且報告乙個不存在的檔案。

如果操作成功那麼返回值為0,失敗則返回-1。除了通常的檔名錯誤外,還定義有如下的errno出錯條件。

enoent filename命名的檔案不存在。

當源**使用_file_offset_bits==64進行編譯時,該函式實際上就是stat64,因為使用lfs支援的介面替代普通的實現。

此函式與stat類似,區別在於它能夠在32位系統上處理大於2g的檔案。為了達到這個目的,結果儲存到乙個struct stat64型別的變數buf上。當源**中使用_file_offset_bits==64來編譯時,該函式在使用stat為函式名時也有效,當然在32位機器上替代小檔案的介面。

fstat函式與stat類似,只是在開啟檔案時使用檔案描述符替代檔名作為引數。像stat函式一樣,fstat函式呼叫成功返回0,失敗則返回-1.下面errno錯誤情況是針對fstat定義的。

ebadf filedes引數是乙個無效的檔案描述符;

如果使用_file_offset_bits==64來編譯時,該函式實際上是fstat64,因此使用lfs檔案支援的介面替代普通的實現。

此函式與fstat類似,區別在於它能夠在32位系統上處理大於2^31的檔案。因為lfs的檔案描述符一般使用open64或者creat64函式得到。buf指標指向的變數型別為struct stat64,用來代表lfs。當源**中使用_file_offset_bits==64來編譯時,該函式在使用stat為函式名時也是有效的,當然在32位機器上替代下檔案的介面。

lstat函式與stat類似,區別在於lstat函式不跟隨符號鏈結。如果flename引數是乙個符號鏈結,lstat函式僅僅返回鏈結本身的資訊,否則lstat和stat函式的作用是相同的。

如果使用_file_offset_bits==64來編譯時,該函式實際上就是stat64,因此使用lfs支援的介面替代普通的實現。

此函式與stat類似,區別在於它能夠在32為系統上處理大於2g大小的檔案。為了達到這個目的,結果儲存到乙個struct stat64型別的buf變數中。當源**中使用_file_offset_bits==64來編譯時,該函式在使用lstat為函式名時也有效,當然在32為機器上替代小檔案的介面。

64位平台轉32位平台總結

一般都是32位平台轉到64位平台,可是我們剛好相。我們公司最近做的分布式檔案系統,以前是在 64位平台下 以為現在的伺服器很少有 32位平台,也就沒有過多的考慮,現在由於客戶需要,不得不修改至 32位平台。現在總結如下,共大家學習。1 資料型別的定義 一般我們都用 typedef 定義資料型別 ty...

xsocks 64位平台下編譯問題小記

1 src common public.h uint32 t lpparameter 改為 void lpparameter 2 socksmgr.cpp dword winapi csocksmgr forwardproc void lpparameter 編譯不過去。因為在 64位平台下,voi...

Linux32位和64位系統的區別及如何選擇?

32位作業系統表示32位cpu對記憶體定址的能力 64位作業系統表示64 位cpu對記憶體定址能力 32位作業系統只能安裝在32位cpu處理器和64位cpu處理器上 64位作業系統只能安裝在64位cpu處理器上 32位作業系統對記憶體不能超過4gb 64位作業系統對記憶體定址可以超過4gb,企業伺服...