#lock-file #unix #systems #atomically #default #created

dotlock

在任何文件系统上原子性地创建 .lock 文件

1 个不稳定版本

使用旧的 Rust 2015

0.5.0 2018 年 10 月 24 日

#1378文件系统

Unlicense

11KB
142

dotlock

Crate Build Status

本库包含用于在各种 UNIX 类型的系统中创建锁文件的支持。这与来自procmaillockfile程序或来自liblockfiledotlockfile程序类似。

文档

用法

将此添加到您的 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 类型的系统中创建锁文件的支持。这与来自procmaillockfile程序或来自liblockfiledotlockfile程序类似。

它们被称为 ".lock" 文件,因为它们传统上以与它们引用的文件相同的名称命名,并以 .lock 扩展名命名。

创建原子方式锁文件的算法如下

  1. 使用 tempfile 创建一个唯一的文件。

  2. 使用 link 系统调用创建目标锁文件。此操作对所有文件系统都是原子的,包括 NFS。此操作的结果被忽略,因为成功基于后续结果。

  3. 删除临时文件。

  4. 检索目标文件的元数据。如果失败,则重复此过程。

  5. 比较临时文件和目标锁文件的元数据。如果它们是同一文件,则我们已成功锁定文件。返回打开的文件。

  6. 如果锁文件过时(比配置的年龄大),则删除现有的锁文件并立即重试。

  7. 在重试之前,短暂睡眠(默认为 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