Per Rust contemporaneo (1,8+) è necessario utilizzare lo fs2
crate. È una libreria multipiattaforma che fornisce alcune funzioni del file system non presenti nella libreria standard, incluso il blocco dei file.
fs2
Le funzioni di blocco file internamente utilizzano flock(2)
su UNIX e LockFileEx
su Windows.
Esempio:
//! 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(())
}
Possiamo vedere che i due processi sono in sequenza in attesa sul blocco di file.
$ ./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
C'è venuto [codice per avviare da] (https://github.com/rust-lang/rust/blob/master/src/librustdoc/flock.rs) in rustdoc. Dice "Questo non è pensato per essere nella libreria standard". – Shepmaster
Penso che potrebbe essere necessario implementarlo da zero. Il modulo IO/OS è ancora molto in divenire, ed è incerto se questa funzionalità sarebbe o non sarebbe adatta per questo ... detto questo, Rust ha abbracciato la distribuzione dei pacchetti anche se Cargo dall'inizio proprio per questo motivo , quindi crea un piccolo pacchetto dedicato a questa funzionalità e condividilo con il mondo tramite casse.io –
È da un po 'che non mi sono fatto molte domande sulle implementazioni di blocco dei file, ma sembra che la libreria Python non sia abbastanza completa. Sembra funzionare principalmente creando file/directory e vedendo se esistono, non fare affidamento sulle funzionalità del sistema operativo. Se si reimplement il blocco dei file, suggerirei di consultare altre risorse per vedere come farlo. – Shepmaster