我有一個多年前用 C 撰寫的實用程式,它獲取給定目錄的所有子目錄中的所有檔案,并根據檔案計數將它們移動到新編號的子目錄中。它已經運行了好幾年沒有錯誤。
昨天它第一次失敗了。它總是在 2.7Gig 視頻檔案上失敗,這可能是該實用程式遇到的最大的視頻檔案。檔案本身沒有損壞。它將在視頻播放器中播放。我可以毫無問題地使用命令列或檔案管理器應用程式移動它。
我使用 ntfw() 來遍歷目錄子樹。在此檔案上,ntfw() 在遇到該檔案時回傳錯誤代碼 -1,然后再呼叫我的回呼函式。由于(我認為)代碼只處理檔案名,而不是實際打開或讀取檔案,我不明白為什么檔案大小應該是一個問題。
打開檔案描述符的數量不是問題。也沒有檔案數量。它位于超過 5,000 個檔案的子樹中,但是當將其移動到僅 50 個檔案中的一個時,它仍然失敗,而原始子樹的處理沒有錯誤。檔案權限不是問題。該檔案與所有其他檔案相同。這包括 ACL 權限。
問題是:檔案大小是問題嗎?為什么?
檔案系統是ext4。
ldd --version /usr/lib/i386-linux-gnu/libc.so
ldd (Ubuntu GLIBC 2.27-3ubuntu1.4) 2.27
Linux version 4.15.0-161-generic (buildd@lgw01-amd64-050)
(gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04))
#169-Ubuntu SMP Fri Oct 15 13:39:59 UTC 2021
uj5u.com熱心網友回復:
當您使用 32 位應用程式時,為了正常處理大于 2 GB 的檔案,您應該編譯-D_FILE_OFFSET_BITS=64以使用 64 位檔案處理系統呼叫和型別。
特別是,如果檔案大小超過 2 GB,則 nftw() 呼叫 stat() 失敗并顯示 EOVERFLOW:https : //man7.org/linux/man-pages/man2/stat.2.html
此外,對于使用 mmap()(您似乎沒有使用,但以防萬一當評論提到它時),您不能分配全部 4 GB,一些地址空間是為內核保留的(在 Linux 上通常為 1 GB)。然后一些空間被堆疊、共享庫等使用。如果幸運的話,也許一次可以映射 2 GB。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/395578.html
上一篇:如何在我的二進制檔案中找到哪個共享庫匯出了哪個匯入的符號?
下一篇:為什么ptrace顯示32位execve系統呼叫具有EAX=59,即64位呼叫號?32位系統呼叫如何在x86-64上作業?
