#inotify #filesystem #linux

wait_file_created

稳健的文件创建等待实现

1 个不稳定版本

0.1.0 2021年8月26日

#888 in Unix API

MITNFA 许可证

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