rust 如何使用文件鎖防止應(yīng)用多開
更新時(shí)間:2024年04月03日 11:36:20 作者:會(huì)編程的大白熊
這篇文章主要介紹了rust 如何使用文件鎖防止應(yīng)用多開,本文給出了進(jìn)程只能單開的方法,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
本文給出了進(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ù)邏輯
// ...庫支持的系統(tǒng)
此庫支持 windows、linux 和 mac,通過如下代碼實(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 庫。
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中實(shí)例化動(dòng)態(tài)對(duì)象的示例詳解
這篇文章主要為大家詳細(xì)介紹了Rust中實(shí)例化動(dòng)態(tài)對(duì)象的多種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
詳解Rust編程中的共享狀態(tài)并發(fā)執(zhí)行
雖然消息傳遞是一個(gè)很好的處理并發(fā)的方式,但并不是唯一一個(gè),另一種方式是讓多個(gè)線程擁有相同的共享數(shù)據(jù),本文給大家介紹Rust編程中的共享狀態(tài)并發(fā)執(zhí)行,感興趣的朋友一起看看吧2023-11-11
Rust 的 into_owned() 方法實(shí)例詳解
into_owned是Rust語言中std::borrow::Cow 枚舉的一個(gè)方法,into_owned確保了調(diào)用者獲得數(shù)據(jù)的獨(dú)立所有權(quán),無論Cow之前是引用還是已經(jīng)擁有數(shù)據(jù),本文給大家介紹Rust 的 into_owned() 方法,感興趣的的朋友跟隨小編一起看看吧2024-03-03

