1 个不稳定版本
0.1.0 | 2021年8月26日 |
---|
#888 in Unix API
17KB
145 行代码(不含注释)
等待文件创建
Rust 包实现稳健的文件创建等待。
关于
如果你的应用程序需要在特定路径等待另一个应用程序创建文件,而不产生竞争条件,这并不是非常明显。此包有助于此,并提供了非常简单的API。首先查看此包中提供的简写函数 - 你可能只需要其中一个。
它使用 inotify
,仅在Linux上可用,以等待文件。没有使用 notify
包,以确保高稳健性。如果我没有在这些平台中发现竞争条件或其他错误,将接受添加其他平台的PR。
示例
use std::io::Read;
let mut file = wait_file_created::robust_wait_read("my/expected/file").unwrap();
let mut contents = String::new();
file.read_to_string(&mut contents).unwrap();
如您所见,该函数返回一个已打开的文件,从而最大限度地减少了竞争条件风险。不幸的是,在所有场景中都无法完全消除。
限制
此库 不能 保证 打开的文件已经完全写入。特别是,如果写入应用程序在您的应用程序尝试打开它之前已经创建了它,但在此之后仍然在写入,则您的应用程序将观察到不完整的数据。
您必须确保您的应用程序可以处理不完整的数据,或者(更好)确保创建文件的应用程序 原子性地 进行操作 - 即首先创建一个临时文件,写入它,然后将其移动到最终位置。此库专门设计用于处理此场景,因此您可以依赖它。
注意,在Linux中还有另一种原子性地创建文件的机制。可以使用 O_TMPFILE
打开一个匿名文件,然后可以使用 linkat()
系统调用将其链接到目录。
如果一个应用程序正在使用 此方法,则通知将仅在文件描述符 关闭 之后接收,即使在此之后打开它是安全的。可以使用 assume_create_is_atomic()
方法来指示并请求立即打开文件。这可能提高性能,或者如果应用程序希望保持文件描述符打开,则确保代码始终运行。如果文件应该为空,也可以使用相同的方法。
许可证
MITNFA
依赖项
~240KB