gpt4 book ai didi

c - 写入()调用失败 : No space left on device: ENOSPC handling

转载 作者:IT王子 更新时间:2023-10-29 01:01:29 25 4
gpt4 key购买 nike

write() 调用失败,errno = 28 (ENOSPC),设备上没有剩余空间。我正在尝试通过以下方式处理此错误。当磁盘已满时,我正在执行 lseek() 以将文件指针移动到文件的开头。

我相信现在 write() 应该不会失败,因为现在文件将从顶部被覆盖(文件不会扩展)。但是 write() 调用仍然失败并出现相同的错误。请解释此行为。

  if(errno == ENOSPC)
{
curPos = lseek(gi4LogFd, 0, SEEK_SET);
break;
}

最佳答案

仅仅因为您写入了文件的开头并不意味着文件系统将写入磁盘上的同一空间或者文件开头的空间已被分配。

你可能在文件中有一个洞,在这种情况下写入无论如何都会失败。漏洞是许多文件系统所做的优化,他们假装文件的一部分在那里,而实际上它只是很多零,所以这些部分永远不会写入磁盘,它只是簿记说文件的特定部分是空的。

您可能已将数据过度分配给您的文件系统(许多文件系统实际上不会在磁盘上分配空间,直到数据从缓冲区缓存中刷新,这可能是几秒钟,如果不是写入完成后几分钟),其中万一写入无论如何都会失败。您获得的 ENOSPC 实际上可能是因为您已经将文件系统填满了 100% 以上的容量,而文件系统代码直到它尝试刷新您刚才执行的写入操作时才发现它。

您可能在日志记录/日志文件系统上,在刷新日志之前不会发生实际的 block 分配,在这种情况下写入将失败。与缓冲区缓存情况相同的逻辑。

您可能已经用完了文件系统上某些特定的预分配元数据,即使它甚至还没有满,它也会因 ENOSPC 而失败。这在今天并不像过去那么普遍。

您的磁盘可能发现它的某些部分坏了,并告诉文件系统不要使用那些占用空间的 block 。

简而言之,不能保证文件系统一旦满了就会表现得像我们天真地认为的那样。除此之外,还有其他原因导致文件系统的填充率永远不会超过 95%。众所周知,几乎所有文件系统在快满时都是不确定的。

关于c - 写入()调用失败 : No space left on device: ENOSPC handling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17917911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com