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

 更新时间:2024年04月03日 11:36:20   作者:会编程的大白熊  
这篇文章主要介绍了rust 如何使用文件锁防止应用多开,本文给出了进程只能单开的方法,结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

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

安装依赖

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 枚举和模式匹配的实现

    Rust 枚举和模式匹配的实现

    枚举是 Rust 中非常重要的复合类型,也是最强大的复合类型之一,广泛用于属性配置、错误处理、分支流程、类型聚合等场景中,本文就来介绍一下Rust 枚举和模式匹配,感兴趣的可以了解一下
    2023-12-12
  • Rust 语言println! 宏的格式占位符详解

    Rust 语言println! 宏的格式占位符详解

    这篇文章主要介绍了Rust语言的println!宏的格式占位符,这只是格式说明符的一部分清单,Rust 的格式化系统非常灵活和强大,支持更多的选项和组合,需要的朋友可以参考下
    2024-03-03
  • Rust使用csv crate构建CSV文件读取器的全过程

    Rust使用csv crate构建CSV文件读取器的全过程

    这篇文章主要学习如何基于Rust使用csv这个crate构建一个CSV文件读取器的过程,学习了csv相关的用法以及一些往期学过的crate的复习,兼顾了实用性和Rust的学习,需要的朋友可以参考下
    2024-05-05
  • 关于使用rust调用c++静态库并编译nodejs包的问题

    关于使用rust调用c++静态库并编译nodejs包的问题

    这篇文章主要介绍了使用rust调用c++静态库并编译nodejs包的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 使用Rust语言编写一个ChatGPT桌面应用示例详解

    使用Rust语言编写一个ChatGPT桌面应用示例详解

    这篇文章主要介绍了如何用Rust编写一个ChatGPT桌面应用,文中有详细的流程介绍,对大家的学习或工作有意一定的帮助,需要的朋友可以参考下
    2023-05-05
  • Rust duckdb和polars读csv文件比较情况

    Rust duckdb和polars读csv文件比较情况

    duckdb在数据分析上,有非常多不错的特质,1、快;2、客户体验好,特别是可以同时批量读csv在一个目录下的csv等文件,今天来比较下Rust duckdb和polars读csv文件比较的情况,感兴趣的朋友一起看看吧
    2024-06-06
  • Go调用Rust方法及外部函数接口前置

    Go调用Rust方法及外部函数接口前置

    这篇文章主要为大家介绍了Go调用Rust方法及外部函数接口前置示例实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Rust中字符串类型String的46种常用方法分享

    Rust中字符串类型String的46种常用方法分享

    Rust主要有两种类型的字符串:&str和String,本文主要为大家介绍的是String类型的字符串以及它常用的46种方法,感兴趣的小伙伴可以了解一下
    2023-06-06
  • Rust利用tauri制作个效率小工具

    Rust利用tauri制作个效率小工具

    日常使用电脑中经常会用到一个quicke工具中的轮盘菜单工具。但quicke免费版很多功能不支持,且它的触发逻辑用的不舒服,经常误触。所以本文就来用tauri自制一个小工具,希望对大家有所帮助
    2023-02-02
  • Rust 语言的全链路追踪库 tracing使用方法

    Rust 语言的全链路追踪库 tracing使用方法

    这篇文章主要介绍了Rust 语言的全链路追踪库 tracing,接下来就以 tracing 为例,介绍一下trace 的核心概念以及使用方法,需要的朋友可以参考下
    2022-12-12

最新评论