我找不到任何类似于文件锁定的东西,比如Linux中的一些程序用来阻止多个实例运行.在Python中,我会使用pylockfile.
我是忽略了Rust中类似的功能,还是应该从头开始实现它?
我并不懒惰,只是尽可能少地 retrofit 车轮
我找不到任何类似于文件锁定的东西,比如Linux中的一些程序用来阻止多个实例运行.在Python中,我会使用pylockfile.
我是忽略了Rust中类似的功能,还是应该从头开始实现它?
我并不懒惰,只是尽可能少地 retrofit 车轮
对于当代 rust 病(1.8+),应使用fs2
crate.它是一个跨平台库,提供一些标准库中找不到的文件系统功能,包括文件锁定.
fs2
的文件锁定函数在UNIX上内部使用flock(2)
,在Windows上内部使用LockFileEx
.
例子:
//! This program tries to lock a file, sleeps for N seconds, and then unlocks the file.
// cargo-deps: fs2
extern crate fs2;
use fs2::FileExt;
use std::io::Result;
use std::env::args;
use std::fs::File;
use std::time::Duration;
use std::thread::sleep;
fn main() {
run().unwrap();
}
fn run() -> Result<()> {
let sleep_seconds = args().nth(1).and_then(|arg| arg.parse().ok()).unwrap_or(0);
let sleep_duration = Duration::from_secs(sleep_seconds);
let file = File::open("file.lock")?;
println!("{}: Preparing to lock file.", sleep_seconds);
file.lock_exclusive()?; // block until this process can lock the file
println!("{}: Obtained lock.", sleep_seconds);
sleep(sleep_duration);
println!("{}: Sleep completed", sleep_seconds);
file.unlock()?;
println!("{}: Released lock, returning", sleep_seconds);
Ok(())
}
我们可以看到,这两个进程是按顺序排列的,等待文件锁定.
$ ./a 4 & ./a 1
[1] 14894
4: Preparing to lock file.
4: Obtained lock.
1: Preparing to lock file.
4: Sleep completed
4: Released lock, returning
1: Obtained lock.
1: Sleep completed
1: Released lock, returning
[1]+ Done ./a 4