IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:disk_io

共 1 篇相关文章

IT 累计浏览 2,707

write(2)在磁盘满的时候的行为

write(2)这个看似简单的系统调用,在磁盘满时的行为其实相当微妙,且容易让人困惑。这篇技术博客深入剖析了其中的关键细节。 文章的核心发现是,当磁盘空间耗尽时,write(2)并不总是立即返回错误。它的行为取决于几个关键变量:文件是否以`O_NONBLOCK`模式打开,以及写入的是否是常规文件或管道。对于常规文件,在非阻塞模式下,内核可能会先“接纳”数据,将其放入内核缓冲区,此时调用甚至可能立即返回成功,但随后的`fsync`或`close`才可能触发真正的空间不足错误(ENOSPC)。而更令人警惕的是,如果写入的是管道,并且使用`O_NONBLOCK`,write(2)可能直接返回`EAGAIN`,这意味着数据并未被写入,存在丢失风险。 作者详细拆解了内核`generic_perform_write`函数的执行路径,解释了这些不同行为背后的实现逻辑。这篇文章的价值在于,它澄清了开发者常有的“write成功即数据落盘”的误解,明确指出了在磁盘I/O的边界条件下,可靠性需要依赖更严格的检查(如fsync)和对不同文件描述符特性的深入理解。