1 个不稳定版本
使用旧的 Rust 2015
0.5.0 | 2018 年 10 月 24 日 |
---|
#1378 在 文件系统
11KB
142 行
dotlock
本库包含用于在各种 UNIX 类型的系统中创建锁文件的支持。这与来自procmail的lockfile
程序或来自liblockfile的dotlockfile
程序类似。
用法
将此添加到您的 Cargo.toml
[dependencies]
dotlock = "0"
...并将其添加到您的 crate 根目录
extern crate dotlock;
示例
extern crate dotlock;
use std::fs::File;
use std::io::{Write, Read, Seek, SeekFrom};
fn main() {
let mut lock = dotlock::Dotlock::create("some.file.lock").unwrap();
writeln!(lock, "Do not touch this file!").unwrap();
}
lib.rs
:
在任何文件系统上原子性地创建 ".lock" 文件。
本库包含用于在各种 UNIX 类型的系统中创建锁文件的支持。这与来自procmail的lockfile
程序或来自liblockfile的dotlockfile
程序类似。
它们被称为 ".lock" 文件,因为它们传统上以与它们引用的文件相同的名称命名,并以 .lock
扩展名命名。
创建原子方式锁文件的算法如下
-
使用
tempfile
创建一个唯一的文件。 -
使用
link
系统调用创建目标锁文件。此操作对所有文件系统都是原子的,包括 NFS。此操作的结果被忽略,因为成功基于后续结果。 -
删除临时文件。
-
检索目标文件的元数据。如果失败,则重复此过程。
-
比较临时文件和目标锁文件的元数据。如果它们是同一文件,则我们已成功锁定文件。返回打开的文件。
-
如果锁文件过时(比配置的年龄大),则删除现有的锁文件并立即重试。
-
在重试之前,短暂睡眠(默认为 5 秒)。
示例
use dotlock::DotlockOptions;
use std::time::Duration;
let _lock = DotlockOptions::new()
.tries(10)
.pause(Duration::from_secs(1))
.create("database.lock").unwrap();
依赖关系
~1.5–10MB
~106K SLoC