首页 > 其他分享 >fcntl文件枷锁模块

fcntl文件枷锁模块

时间:2023-06-19 16:35:26浏览次数:34  
标签:fcntl 模块 枷锁 LOCK file lock path flock

fcntl模块

本模块基于文件描述符来进行文件控制和 I/O 控制。它是 Unix 系统调用 fcntl()ioctl() 的接口。关于这些调用的完整描述,请参阅 Unix 手册的 fcntl(2)ioctl(2) 页面。

flock介绍

fcntl.flock(f, operation)

f: 文件描述符
operation:  操作
    fcntl.LOCK_UN  解锁
    fcntl.LOCK_EX  排他锁:其他进程会阻塞等待
    fcntl.LOCK_SH  共享锁:所有进程没有写访问权限,即使是加锁进程也没有。所有进程有读访问权限。
    fcntl.LOCK_NB  非阻塞锁:如果获取不到锁,将引发OSError异常

flock用法

flock锁可以递归,即通过dup或者fork产生的两个fd,都可以进行加锁而不会死锁。

  • 对文件 close 后文件锁会失效
  • 进程结束后文件锁会失效
import fcntl

# flock 生成的是劝告锁,因此进程可以正常打开文件
fd = open("/tmp/test.txt")
# 检测文件是否被加锁。如果已经上了锁,那么这里就会被阻塞
fcntl.flock(fd, fcntl.LOCK_EX)
# fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)  # 用 LOCK_NB 就不会被阻塞

# 解锁
# fd.close()也会解锁
fcntl.flock(fd, fcntl.LOCK_UN)  # 对文件进行解锁

配合with使用

with后会自动关闭文件,相当于自动解锁了

import fcntl
file_name = "/tmp/test.txt"
with open(file_name , 'r') as f:
  # 添加排他锁
  fcntl.flock(f, fcntl.LOCK_EX)
  # To do something

类方法装饰器使用

import os
import fcntl
import subprocess

def lock_file(file_name="lock.txt"):
  def wrapper(func):
    def inner(obj, *args, **kwargs):
      lock_file_path = os.path.join(os.environ["HOME"], "lock", file_name)
      if not os.path.exists(lock_file_path):
        subprocess.run("mkdir -p " + os.path.dirname(lock_file_path))
        subprocess.run("touch " + lock_file_path)
      print(file_name.center(60, '='))
      with open(lock_file_path, 'r+') as f:
        try:
          # 非阻塞锁
          fcntl.flock(f, fcntl.LOCK_NB)
          res = func(obj, *args, **kwargs)
          return res
        except IOError:
          fatal(f"另一个进程正在操作改目录[{branch}]!!!")
    return inner
  return wrapper

flock和lockf的区别

第一个区别是flock只能对整个文件进行上锁,而不能对文件的某一部分上锁,lockf可以对文件的某个区域进行上锁。
第二个区别是flock只能产生劝告性锁。flock可以有共享锁和排他锁,而lockf只支持排他锁。
第三个区别主要是在使用fork/dup的情况。
第四个区别是flock不能在NFS文件系统上使用,要在NFS上使用需要用 fcntl。

标签:fcntl,模块,枷锁,LOCK,file,lock,path,flock
From: https://www.cnblogs.com/lxd670/p/17491452.html

相关文章

  • nodejs 伪全局变量模块
    使用这个文件可以实现不同文件中读写变量,适合当做共享变量文件名:globals.tsletglobals:any={myGlobal:{value:'canbeanytype:String,Array,Object,...'},aReadonlyGlobal:{value:'thisvalueisreadonly',protected:......
  • BOSHIDA AC DC电源模块在工业控制器的应用
    BOSHIDAACDC电源模块在工业控制器的应用AC/DC电源模块是一种广泛应用于工业控制器中的电源设备,它的作用是将交流电源转换为直流电源,为工业控制器提供稳定可靠的电源供应。在工业控制器中,AC/DC电源模块的应用不仅可以提高系统的稳定性和可靠性,还可以实现节能和环保,降低系统维护......
  • nrf52832学习-app_timer模块
    简单使用:app_timer是模块,使用时需要在sdk_config.h文件中将其使能添加头文件app_timer.h定义Timer定时器唯一识别号_my_timer_id和需要的定时时间常量MY_TIMER_INTERVALAPP_TIMER_DEF(_my_timer_id);#defineMY_TIMER_INTERVALAPP_TIMER_TICKS(_milliseconds)......
  • nrf52832学习-app_scheduler模块
    软件调度模块,但不是用来做任务调度的,而是为了在main函数中执行中断任务。说白了就是一个队列,中断中将数据和执行的函数放入队列中,然后main函数里一直去调用查询去执行,从而不阻塞中断app_sched_execute用来在main函数中执行,一直调用app_sched_event_put函数是在中断中调用将任务添......
  • Python第三方模块:pymongo模块的用法
    pymongo模块是python操作mongo数据的第三方模块,记录一下常用到的简单用法。首先需要连接数据库:MongoClient():该方法第一个参数是数据库所在地址,第二个参数是数据库所在的端口号authenticate():该方法第一个参数是数据库的账号,第二个参数是数据库的密码frompymongoimpor......
  • 【雕爷学编程】Arduino动手做(115)---HB100多普勒雷达模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • Loguru:优雅的日志管理模块
    安装pip3installloguru日志等级等级方法TRACElogger.trace()DEBUGlogger.debug()INFOlogger.info()SUCESSlogger.sucess()WARNINGlogger.warnning()ERRORlogger.error()CRITICALlogger.critical()基本使用fromloguruimportlogger......
  • 【雕爷学编程】Arduino动手做(114)---US-015高分辨超声波模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是......
  • OverTheWire攻关过程-Natas模块8
    我们打开lv8,查看信息有一个验证框输入值显示错误将输入的值进行对比,相同就过我们将值输入错误查询下这些加密函数将数字装换下控制台不行然后查询函数反转字符串函数查询解码以下是过程,使用的都是在线工具16进制转换成字符串反转字符base64解码得到结果oubWYf2kBq提交得到密码验证......
  • OSI七层协议剩余、socket模块、半连接池
    传输层之TCP与UDP协议TCP与UDP都是用来规定通信方式的 通信的时候可以随心所欲的聊也可以遵循一些协议符合要求的聊随心所欲的聊:文字图片视频遵循一些协议:开头带尊称首行空两个只准用官话ps:不遵循上述协议也可以通信只不过遵循了更合规合法合理!!!1.TCP协议(重......