Unix & Linux 文件并发 Read/Write 处理
Unix & Linux Files Concurrent Read/Write Handling
先了解一些信息。
Web 服务器文档根目录:/mySite/docroot/
CMS writes a **new** file index-new.html to a SAN/NAS filesystem (Linux/Unix): /mySite/docroot/
CMS writes to an **existing** file index-ex.html to a SAN/NAS filesystem (Linux/Unix): /mySite/docroot/
浏览器访问 /mySite/docroot/
下读取 index-new.html
& index.ex.html
的 Web 服务器
问题来了
当 CMS 正在写入索引-new.html 和索引-ex.html(仅完成 50%)而 Web 服务器同时读取它们时,行为是什么?
文件写入时是否会被Linux/Unix自动锁定以避免其他进程读写?
如果是,Web 服务器是否会等到锁被释放,或者如果检测到锁 returns 错误?
如果没有,如何确保网络服务器发送的文件具有完整的地址?
没有。文件写入不是原子的。
这里的基本思路是创建一个临时文件并重命名。重命名文件是原子操作,因此会出现 "not exist" 错误或正确命中。
此外,在覆盖现有文件时,对 Linux 的 rename()
调用或对其他 OS 的等效调用将自动覆盖该文件。这样,您可以确保旧的或新的都以完整的形式提供。
先了解一些信息。
Web 服务器文档根目录:/mySite/docroot/
CMS writes a **new** file index-new.html to a SAN/NAS filesystem (Linux/Unix): /mySite/docroot/
CMS writes to an **existing** file index-ex.html to a SAN/NAS filesystem (Linux/Unix): /mySite/docroot/
浏览器访问 /mySite/docroot/
index-new.html
& index.ex.html
的 Web 服务器
问题来了
当 CMS 正在写入索引-new.html 和索引-ex.html(仅完成 50%)而 Web 服务器同时读取它们时,行为是什么?
文件写入时是否会被Linux/Unix自动锁定以避免其他进程读写?
如果是,Web 服务器是否会等到锁被释放,或者如果检测到锁 returns 错误?
如果没有,如何确保网络服务器发送的文件具有完整的地址?
没有。文件写入不是原子的。
这里的基本思路是创建一个临时文件并重命名。重命名文件是原子操作,因此会出现 "not exist" 错误或正确命中。
此外,在覆盖现有文件时,对 Linux 的 rename()
调用或对其他 OS 的等效调用将自动覆盖该文件。这样,您可以确保旧的或新的都以完整的形式提供。