rust 如何使用文件锁防止应用多开

 更新时间:2024年04月03日 11:36:20   作者:会编程的大白熊  
这篇文章主要介绍了rust 如何使用文件锁防止应用多开,本文给出了进程只能单开的方法,结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

本文给出了进程只能单开的方法。

安装依赖

cargo add fslock

使用方法

use fslock::LockFile;
// 打开pid文件,没有则自动创建
let mut pid_lock =
        LockFile::open(&pid_path.clone().into_os_string()).unwrap();
// 非阻塞的锁文件
if !pid_lock.try_lock_with_pid().unwrap() {
    // 如果文件已经被锁,则退出进程
    // ...
}
// 文件加锁成功,则执行业务逻辑
// ...

库支持的系统

此库支持 windowslinuxmac,通过如下代码实现

#[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;

原理简介

1. 锁操作

linux

调用 libc.so的接口实现,目的是不使用 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. 进程退出解锁清空文件内容

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)?;
        // 解锁后清空文件内容
        sys::truncate(self.desc)?;
        Ok(())
    }

到此这篇关于rust 如何使用文件锁防止应用多开的文章就介绍到这了,更多相关rust 文件锁内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • 从零开始使用Rust编写nginx(TLS证书快过期了)

    从零开始使用Rust编写nginx(TLS证书快过期了)

    wmproxy已用Rust实现http/https代理,?socks5代理,?反向代理,?负载均衡,?静态文件服务器,websocket代理,四层TCP/UDP转发,内网穿透等,本文给大家介绍从零开始使用Rust编写nginx(TLS证书快过期了),感兴趣的朋友一起看看吧
    2024-03-03
  • rust标准库std::env环境相关的常量

    rust标准库std::env环境相关的常量

    在本章节中, 我们探讨了Rust处理命令行参数的常见的两种方式和处理环境变量的两种常见方式, 抛开Rust的语法, 实际上在命令行参数的处理方式上, 与其它语言大同小异, 可能影响我们习惯的也就只剩下语法,本文介绍rust标准库std::env的相关知识,感兴趣的朋友一起看看吧
    2024-03-03
  • rust中间件actix_web在项目中的使用实战

    rust中间件actix_web在项目中的使用实战

    这篇文章主要介绍了rust中间件在项目中的使用实战,包括自定义中间件,日志中间件,Default?headers,用户会话,错误处理的用法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Rust标量类型的具体使用

    Rust标量类型的具体使用

    本文主要介绍了Rust标量类型的具体使用,其中包括整数类型、浮点类型、布尔类型以及字符类型,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Rust读取配置文件的实现

    Rust读取配置文件的实现

    本文主要介绍了Rust读取配置文件的实现,主要读取Cargo.toml文件,读取.env文件和读取自定义toml文件这三种,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Rust中的Copy和Clone对比分析

    Rust中的Copy和Clone对比分析

    这篇文章主要介绍了Rust中的Copy和Clone及区别对比分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Rust生成随机数的项目实践

    Rust生成随机数的项目实践

    Rust标准库中并没有随机数生成器,常见的解决方案是使用rand包,本文主要介绍了Rust生成随机数的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Rust调用C程序的实现步骤

    Rust调用C程序的实现步骤

    本文主要介绍了Rust调用C程序的实现步骤,包括创建C函数、编译C代码、链接Rust和C代码等步骤,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • rust生命周期详解

    rust生命周期详解

    生命周期是rust中用来规定引用的有效作用域,在大多数时候,无需手动声明,因为编译器能够自动推导,这篇文章主要介绍了rust生命周期相关知识,需要的朋友可以参考下
    2023-03-03
  • 用rust?写一个jar包?class冲突检测工具

    用rust?写一个jar包?class冲突检测工具

    这篇文章主要介绍了用rust?写一个jar包?class冲突检测工具?的相关资料,需要的朋友可以参考下
    2023-05-05

最新评论

?


http://www.vxiaotou.com