【问题标题】:If the size of the file exceeds the maximum size of the file system, what happens?如果文件的大小超过了文件系统的最大大小,会发生什么?
【发布时间】:2018-02-22 23:24:55
【问题描述】:

例如,在 FAT32 分区中,最大文件大小为 4GB。但是我能够用 vim 创建一个 5GB 的文件,然后我保存了文件并再次打开它,控制台输出像楼梯一样被破坏了。我有三个问题。

  1. 如果文件的大小超过了文件系统的最大大小,会发生什么?

  2. 在我的情况下,为什么会中断?

  3. 在 Unix 系统调用中,stat() 可以成功达到 2GB(2^31 - 1)。这和文件系统有关系吗? stat()中数据的限制和文件系统中每个特征的限制有关系吗?

【问题讨论】:

  • write 将失败,并带有稍微令人困惑的ENOSPC(“设备上没有剩余空间”);在第三次左右之后cp 因该错误而失败并且我清空了 USB 密钥无济于事,我学会了检查我正在复制的文件的大小是否超过 4 GB,然后再考虑设备上剩余的空间.

标签: linux unix filesystems partition


【解决方案1】:

如果文件的大小超过了文件系统的最大大小,会发生什么?

根据定义,这永远不会发生。真正发生的是某些系统调用(可能是write(2) ...)失败了,执行该操作的代码应该处理这种情况。

请注意,FAT32 文件系统将文件的最大大小限制为 2GB。如果您想要更多,请在您的 USB 密钥上使用更好的file system(或者在将它们复制到您的 FAT32 格式的 USB 密钥之前,将它们分成小块的split(1) 大文件)。

如果使用<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)

我能够使用vim 创建一个 5GB 的文件

要了解vim 的行为,请先阅读它的文档,然后再研究它的源代码(它是free software,您可以而且也许应该研究它的代码)。

您还可以使用strace(1) 了解某些命令或进程执行了哪些系统调用。

【讨论】:

  • 它是特定于文件系统的。 FAT32 将文件大小限制为 2Gb。使用更好的文件系统格式化您的 USB 密钥
  • 在大多数 64 位 Linux 系统上,来自 libc 的 stat 函数正在调用 stat64
  • stat() 在 64 位系统上返回 64 位变量的大小,如果您在不使用 stat() 的 64 位类型的 32 位系统上 - 您通常可以使用编译#define _FILE_OFFSET_BITS=64 让 stat() 透明地使用 64 位变体。
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 2014-03-22
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多