2017-09-14 70 views
0

例如,在FAT32分區中,最大文件大小爲4GB。但是我可以用vim創建一個5GB文件,然後我保存了該文件並再次打開它,控制檯輸出像樓梯一樣被打破。我有三個問題。如果文件大小超過文件系統的最大大小,會發生什麼情況?

  1. 如果文件的大小超過了文件系統的最大大小,會發生什麼?

  2. 在我的情況下,爲什麼打破?

  3. 在Unix系統調用中,stat()可以成功達到2GB(2^31-1)。這與文件系統有什麼關係? stat()中的數據限制與文件系統中每個功能的限制之間是否存在關係?

+1

'write'將會失敗,同時會產生一些令人困惑的'ENOSPC'(「設備上沒有剩餘空間」);在第三次以後,'cp'失敗了,並且我清空了一個USB密鑰而無濟於事,我學會了檢查我正在複製的文件的大小是否超過了4GB,然後才考慮設備上剩餘的空間。 –

回答

1

如果文件的大小超過了文件系統的最大大小,會發生什麼?

根據定義,這是不可能發生的。真正發生的是一些系統調用(可能是write(2) ...)失敗,並且執行該操作的代碼應該處理這種情況。

請注意,FAT32文件系統將文件的最大大小限制爲2G字節。如果您需要更多(或將split(1)較大的文件複製到FAT32格式的USB密鑰之前),請在您的USB密鑰上使用更好的file system

如果使用<stdio.h>公告稱fflush(3)fprintf(3)fclose(3)(和大多數其他標準功能)可能會失敗(例如,因爲他們會做一些失敗write(2))。

控制檯輸出被打破就像一個樓梯

可能是因爲您的pseudoterminal是一些破碎的狀態。請參閱stty(1)reset(1)termios(3)並閱讀tty demystified

在Unix的系統調用,STAT()能夠成功達到了2GB(2^31 - 1)

你誤會stat(2)。再次閱讀其文檔

閱讀Advanced Linux Programming然後syscalls(2)

我能夠創建一個5GB文件用vim

要了解閱讀的vim行爲首的文檔,然後研究它的源代碼(這是free software,你可以,也許應該研究其碼)。

您也可以使用strace(1)來了解某些命令或進程完成了哪些系統調用。

+0

它是文件系統特定的。 FAT32將文件大小限制爲2Gb。使用更好的文件系統格式化您的USB密鑰 –

+0

在大多數64位Linux系統上,來自libc的'stat'函數調用'stat64' –

+2

stat()返回64位系統上64位變量的大小,如果你在一個32位的系統上,stat()不使用64位類型 - 通常你可以使用#define _FILE_OFFSET_BITS = 64來編譯stat()透明地使用64位變體。 – nos

相關問題