rust 如何使用文件鎖防止應(yīng)用多開
本文給出了進(jìn)程只能單開的方法。
安裝依賴
cargo add fslock
使用方法
use fslock::LockFile; // 打開pid文件,沒有則自動(dòng)創(chuàng)建 let mut pid_lock = LockFile::open(&pid_path.clone().into_os_string()).unwrap(); // 非阻塞的鎖文件 if !pid_lock.try_lock_with_pid().unwrap() { // 如果文件已經(jīng)被鎖,則退出進(jìn)程 // ... } // 文件加鎖成功,則執(zhí)行業(yè)務(wù)邏輯 // ...
庫(kù)支持的系統(tǒng)
此庫(kù)支持 windows
、linux
和 mac
,通過(guò)如下代碼實(shí)現(xiàn)
#[cfg(unix)] mod unix; #[cfg(unix)] use crate::unix as sys; mod string; mod fmt; #[cfg(windows)] mod windows; #[cfg(windows)] use crate::windows as sys;
原理簡(jiǎn)介
1. 鎖操作
linux
調(diào)用 libc.so的接口實(shí)現(xiàn),目的是不使用 std
庫(kù)。
pub fn try_lock(fd: FileDesc) -> Result<bool, Error> { let res = unsafe { libc::flock(fd, libc::LOCK_EX | libc::LOCK_NB) }; if res >= 0 { Ok(true) } else { let err = errno(); if err == libc::EWOULDBLOCK || err == libc::EINTR { Ok(false) } else { Err(Error::from_raw_os_error(err as i32)) } } }
windows
pub fn try_lock(handle: FileDesc) -> Result<bool, Error> { let mut overlapped = make_overlapped()?; let drop_handle = DropHandle { handle: overlapped.hEvent }; let res = unsafe { LockFileEx( handle, LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY, 0, 1, 1, &mut overlapped as LPOVERLAPPED, ) }; let ret = if res == TRUE { let res = unsafe { WaitForSingleObject(overlapped.hEvent, 0) }; if res != WAIT_FAILED { Ok(true) } else { Err(Error::last_os_error()) } } else { let err = unsafe { GetLastError() }; if err == ERROR_LOCK_VIOLATION { Ok(false) } else { Err(Error::from_raw_os_error(err as i32)) } }; drop(drop_handle); ret }
2. 進(jìn)程退出解鎖清空文件內(nèi)容
impl Drop for LockFile { fn drop(&mut self) { if self.locked { let _ = self.unlock(); } sys::close(self.desc); } } pub fn unlock(&mut self) -> Result<(), sys::Error> { if !self.locked { panic!("Attempted to unlock already unlocked lockfile"); } self.locked = false; sys::unlock(self.desc)?; // 解鎖后清空文件內(nèi)容 sys::truncate(self.desc)?; Ok(()) }
到此這篇關(guān)于rust 如何使用文件鎖防止應(yīng)用多開的文章就介紹到這了,更多相關(guān)rust 文件鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Rust采集天氣預(yù)報(bào)信息并實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)功能
Rust作為一種高效、安全的編程語(yǔ)言,可以用于開發(fā)各種應(yīng)用,包括天氣預(yù)報(bào)采集系統(tǒng),本文將探討如何使用Rust來(lái)采集天氣預(yù)報(bào)信息,并實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)的功能,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01Rust調(diào)用函數(shù)操作符?.?和?::?的區(qū)別詳解
在Rust中,.和::操作符都可以用來(lái)調(diào)用方法,但它們的用法有所不同,所以本文就將詳細(xì)的給大家介紹一下.和::操作符的區(qū)別,感興趣的同學(xué)跟著小編一起來(lái)學(xué)習(xí)吧2023-07-07Rust?實(shí)現(xiàn)?async/await的詳細(xì)代碼
異步編程在 Rust 中的地位非常高,很多 crate 尤其是多IO操作的都使用了 async/await,這篇文章主要介紹了Rust?如何實(shí)現(xiàn)?async/await,需要的朋友可以參考下2022-09-09