文件锁

Python多进程同步——文件锁 阅读详情


1. sample学习代码

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#define read_lock(fd, offset, whence, len) \
            lock_reg((fd), F_SETLK, F_RDLCK, (offset), (whence), (len))
#define readw_lock(fd, offset, whence, len) \
            lock_reg((fd), F_SETLKW, F_RDLCK, (offset), (whence), (len))
#define write_lock(fd, offset, whence, len) \
            lock_reg((fd), F_SETLK, F_WRLCK, (offset), (whence), (len))
#define writew_lock(fd, offset, whence, len) \
            lock_reg((fd), F_SETLKW, F_WRLCK, (offset), (whence), (len))
#define un_lock(fd, offset, whence, len) \
            lock_reg((fd), F_SETLK, F_UNLCK, (offset), (whence), (len))

#define is_read_lockable(fd, offset, whence, len) \
            (lock_test((fd), F_RDLCK, (offset), (whence), (len)) == 0)
#define is_write_lockable(fd, offset, whence, len) \
            (lock_test((fd), F_WRLCK, (offset), (whence), (len)) == 0)

pid_t
lock_test(int fd, int type, off_t offset, int whence, off_t len)
{
    struct flock lock;

    lock.l_type = type;
    lock.l_start = offset;
    lock.l_whence = whence;
    lock.l_len = len;

    if (fcntl(fd, F_GETLK, &lock) < 0) {
        printf("fcntl error\n");
        exit(1);
    }

    if (lock.l_type == F_UNLCK)
        return (0);
    return (lock.l_pid);
}

int
lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len)
{
    struct flock    lock;

    lock.l_type = type;
    lock.l_start = offset;
    lock.l_whence = whence;
    lock.l_len = len;

    return (fcntl(fd, cmd, &lock));
}

int
main(int argc, char *argv[])
{
    int fd;
    int flag;
    int result;

    if (argc != 3) {
        printf("usage %s -[rw] <filename>\n", argv[0]);
        exit(1);
    }

    if (argv[1][0] == 'r')
        flag = O_RDONLY;
    else if (argv[1][0] == 'w')
        flag = O_WRONLY;
    else {
        printf("invalid flag: 'r' or 'w'\n");
        exit(1);
    }

    if ((fd = open(argv[2], flag)) < 0) {
        printf("cannot open %s, %s\n", argv[2], strerror(errno));
        exit(2);
    }

    printf("open successfully\n");
    // test if write lock work.

    if (flag == O_RDONLY) {
        printf("read lock, ");
        result = read_lock(fd, 0, SEEK_SET, 0);
    }
    else {
        printf("write lock, ");
        result = write_lock(fd, 0, SEEK_SET, 0);
    }

    if (result < 0) {
        printf("lock fail, %s\n", strerror(errno));
        exit(3);
    }
    printf("success!\n");
    while (1) {
        //# loop forever;
    }
    exit(0);
}


当对整个文件获得写入锁时,其他的程序(vim)还是可以对文件进行写入,并且保存成功。为什么?


PHP文件锁 PHP文件锁... 阅读详情

相关推荐

fd-lock-使用文件描述符对文件的咨询性跨平台锁定-Rust开发

fd-lock使用文件描述符的咨询性跨平台文件锁。 改编自mafintosh / fd-lock。 请注意,咨询性锁合规性是可选的,并且c fd-lock咨询性跨平台文件锁使用文件描述符。 改编自mafintosh / fd-lock。 请注意,咨询性锁合规性是可选的,其他各方可以随意忽略。 这意味着此板条箱绝对不能用于安全目的,而只能用于协调文件访问。 文档Crates.io发布示例基本用法使用fd_lock :: FdLock; 使用tempfile :: tempfile; 使用std :: io :: prelude :: *; 使用std :: fs :: File; fn main()->结果{//锁定

Linux环境terminal/shell/vim下常用指令

Limux Terminal -f filename #如果 filename为常规文件,则为真【用于锁定文件】 #等价于:-f <filename>.f,加载文件,其中包含source file和simulation option if [ -f /etc/sysconfig/network ]; then ./etc/sysconfig/network fi 补充: -e ............

sinat_29862967的博客 1900

fs2-rs:用于在Rust中处理文件和文件系统的扩展实用程序

fs2 用于在Rust中处理文件和文件系统的扩展实用程序。 fs2需要Rust稳定为1.8或更高。 特征 文件描述符重复。 文件锁。 文件(预)分配。 文件分配信息。 文件系统空间使用情况信息。 平台类 fs2应该可以在支持的任何平台上运行。 fs2在以下方面进行了持续测试: x86_64-unknown-linux-gnu (Linux) i686-unknown-linux-gnu x86_64-apple-darwin (OSX) i686-apple-darwin x86_64-pc-windows-msvc (Windows) i686-pc-windows-msvc x86_64-pc-windows-gnu i686-pc-windows-gnu 基准测试 为提供的方法提供了简单的基准。 这些基准中的许多基准使用临时目录中的文件。 在许多现代Li

vim在编辑文件时不小心按了Ctrl+S之后屏幕锁死, 怎么处理?

也许是你编辑文件太投入了, 有于使用Window习惯了, 下意识的就按了 Ctrl+S, 这时你按什么键都没有反映, 这是因为 Ctrl+S是linux下的锁屏键, 那既然可以锁屏, 那自然也就是有触屏键了 嗯嗯, 就是它 Ctrl+Q 退出锁屏状态! Ctrl+S Good Luck!

牧马人 6632

区块链入门:用账本、乐高和三台旧电脑讲懂分布式账本

区块链是一种去中心化的分布式账本技术,其核心原理是通过密码学哈希、共识机制和链式结构实现数据不可篡改与多方共同验证。它不依赖单一中心,而是将交易记录同步复制到多个节点,依靠数学规则而非人工信任达成一致,从而在数字世界构建可验证的信用基础设施。这种‘集体见证’模式显著提升了系统抗单点故障与人为干预的能力,广泛应用于供应链溯源、数字身份、教育管理及公益透明等需强信任保障的场景。本文以账本类比、乐高拆解和Ganache实操为线索,面向零基础读者通俗解析哈希值、挖矿与智能合约等关键概念。

weixin_30517215的博客 274

Unity 实现动态网格地图生成与交互组件

本文详细介绍了在Unity中实现动态网格地图生成与交互组件的完整方案。从基础网格单元实现到高级交互功能,涵盖网格生成器核心逻辑、事件驱动架构、性能优化技巧以及六边形网格等特殊实现。特别适合游戏开发者学习如何构建战棋、模拟经营类游戏的可交互地图系统,提升开发效率与用户体验。

weixin_29015483的博客 1068

终端下vim给锁住了

场景, 同事的mac正在操作一个shell, 里面会去执行某些远程操作的命令. 然后弹出了git的commit comment 界面, 要求输入comments 然后突然这个界面就卡死了, 但是其它分屏, 系统都是正常的. 这个是一个终端的很老的功能, 叫软件流控制(XON/XOFF flow control) 就是当client(terminal emulator), 我们用的终端

rainysia的专栏 4865

【时空数据分析#06】实战:基于Python与ArcGIS的NDVI长期趋势制图与分级

本文详细介绍了基于Python与ArcGIS进行NDVI长期趋势制图与分级分析的完整工作流。通过整合MODIS卫星数据,利用ArcGIS进行空间处理与栅格转换,结合Python进行时序统计与趋势计算,最终生成直观的植被变化趋势分级图,为生态评估与环境监测提供可靠的空间分析工具。

lilh34434的博客 474

VIM锁屏与解锁

VIM经常不小心被自己锁住,查了解锁方法后,不久又会忘记。现在记录一下,提醒一下自己: 在vim中: 使用 CTRL+s 可以锁屏 使用 CTRL+q 可以解锁。 PS: ctrl+z停止进程后, 用fg恢复。

Data spark in Pypot 8628

GPMC开发笔记(TI开发者推荐笔记)

因为gpmc(General-Purpose Memory Controller)是TI特有的驱动,gpmc的资料比较少,本人开发gpmc驱动算是摸了很多石头过河的。所以想通过这遍文章可以给也做GPMC驱动开发的后来者有一点参考价值。文章如有瑕疵也请各位批评改正。 1.GPMC介绍 gpmc主要用于与nandflash,norflash,fpga进行通信。在这里主要介绍gpmc16位数据和地址线不复用nor模式下的通信。 注意:在这种模式下gpmc_a[0]引脚是没法使用的 1.1GPMC信号线

weixin_44316996的博客 7498

快速上手CH340N电路设计(CH340N USB转串口模块 USB Type-C接口 CH340系列芯片讲解)

一、上模块 二、功能分析 l 芯片:CH340N l 输入接口:USB、TYPE-C l 输出接口:TTL(5V\3.3V\GND\TX\RX) l 指示灯:电源、TX、RX 三、CH340x芯片 l CH340 是一个 USB 总线的转接芯片,实现 USB 转串口 l 全速 USB 设备接口,兼容 USB V2.0 l 硬件全双工串口,内置收发缓冲区,支持通讯波特率 50bps~2Mbps l 支持常用的 MODEM 联络信号 RTS、DTR、DCD、RI、DS...

东小东博客 5万+

文件锁浅谈

笔者近日在生产环境遇到文件锁故障java.io.IOExceptionnolocksavailable,造成上线延期,在此谈谈文件锁,以及它的应用。在程序开发中,比较常见遇到的是进程内锁,就Java后端而言,尝尝使用悲观锁和乐观锁来处理,如synchronized关键字等。如果是进程之间使用锁,就可以考虑文件锁,比如在同一个节点上,部署两个实例,这两个实例需要通过锁来进行同步。如果是多节点的进程之间需要同步,也可以考虑文件锁,只不过文件锁需要在共享文件系统上,比如nfs文件系统。

sinat_28694519的博客 1137

【图像拼接】论文精读:As-Rigid-As-Possible Shape Manipulation(ARAP)

文章目录前言1.摘要2.算法的总体流程总结 前言 图像变形算法 1.摘要 论文提出了一个二维图形互动系统。图形是建立在三角形网格上的,用户只需移动几个网格顶点(限制顶点),系统通过最小化每个三角形的误差计算网格剩余顶点(自由顶点)的位置。 算法分两步: 适当旋转每个三角形。 调整大小。 关键是使用二次度量误差将最小化问题转换成线性方程组,然后再解这个方程组。 刚性形状变形是很难的,论文的研究使其变得简单。 2.算法的总体流程 总的流程分三步: 将图形用三角形网格覆盖 选择三个点(限制顶点) 操纵限

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 15万+

文件锁的本质核心和原理

flock 实现细节 能够实现进程的互斥,主要是依靠了内核里统一的资源入口控制在flock 的 man page 中有关于 flock 细节的一些描述。其中说明了flock 是与打开文件的文件表项相关联的。根据《Unix 环境高级编程》对打开文件的介绍,打开的文件在进程表和操作系统中的对应的结构如下图所示:每个进程在进程表中都一个对应的项目,叫做进程表项,上图是最左边展示了进程表中两进程表项...

求变,从思想开始 1万+

深度解析 Android 开发工程师岗位:技术栈、职责与面试全攻略

本文深度剖析Android开发工程师职位要求,从核心技术栈到面试准备进行全面解读。关键点包括:1)掌握Kotlin语言特性和Jetpack组件;2)具备UI开发、性能优化和逆向分析能力;3)理解MVVM架构和Room数据库;4)熟悉常用工具链和开发流程。文章提供了详细的面试题库及解析,涵盖基础概念、UI优化、架构设计等方向,并给出职业发展建议:夯实基础、拓展技术广度、培养工程素养。旨在帮助开发者系统性地准备Android岗位求职,把握移动开发领域的技术趋势。

郑伟强dev的专栏 172

10分钟搞定小红书爆款笔记爬取!Selenium模拟登录+数据解析全流程,新手也能落地

小红书爬虫实战的核心,是**“模拟真人操作+解析结构化数据”**——Selenium解决了动态页面和登录的问题,lxml解决了数据提取的问题,pandas解决了数据存储的问题。新手学爬虫不用一开始就啃复杂的反爬机制,先从这类“可见即可爬”的场景入手,掌握“模拟操作→数据解析→数据保存”的全流程,再逐步叠加异常处理、批量爬取、反爬应对等功能。需要注意的是:爬取数据仅用于个人学习和研究,不得用于商业用途,且需遵守小红书的用户协议,不要过度爬取导致服务器压力。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1728

Linux 文件锁的原理、实现和应用

一篇文章彻底搞懂Linux 文件锁的原理、实现和应用

Yang的博客 9106

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文件锁(二)——文件锁的读锁和写锁

文件锁的读锁和写锁 对文件加锁时可以加两种锁,分别是“读文件锁”和“写文件锁”,简称读锁和写锁。 读锁、写锁之间关系 读锁和读锁共享:可以重复加读锁,别人加了读锁在没有解锁之前,我依然可以加读锁,这就是共享。 读锁和写锁互斥:别人加了读锁没解锁前,加写锁会失败,反过来也是如此。 加锁失败后两种处理方式: 阻塞,直到别人解锁然后加锁成功为止。 出错返回,不阻塞 写锁与写锁互斥:别人加了写锁在没有解锁前,不能加写锁,加写锁会失败。 加锁失败后两种处理方式: 阻塞,直

Scroll_C的博客 8901

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

golang下文件锁的使用

前言 题目是golang下文件锁的使用,但本文的目的其实是通过golang下的文件锁的使用方法,来一窥文件锁背后的机制。 为什么需要文件锁 只有多线程/多进程这种并发场景下读写文件,才需要加锁, 场景1-读写并发 读写并发场景下,如果不加锁,就会出现读到脏数据的情况。想象一下,读文件的进程,读到第500字节,有其它进程以覆盖写的方式向文件中写入1000字节,那读进程读到的后500字节就是脏数据。 场景2-写写并发 写写并发场景下,如果不加锁,假设A进程先写0-1000字节,B进程写0-900字节,以此类

AFreeCoder的博客 6353

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

文件锁(三)——文件锁的原理

文件锁的原理 理解了文件锁的原理后,就可以理解为什么文件锁可以实现互斥与共享了。 若A进程与B进程同时打开同一个文件,他们使用同一个文件表,使用同一个V节点,V节点指向hello这个文件,里面有一个锁链表,里面记录了锁的信息。 加锁时,进程会检查共享的文件锁链表 如果链表上只有读锁节点 所有目前其他进程对该文件只加了读锁,由于读锁时共享的,所以不管链表上有几个读节点,当前进程都能成功加读锁。 图: 提供:链表上可不可以存在n多个读锁节点? 答:可以,因为读锁是共享的,不管别的进程有没有

Scroll_C的博客 1844

JAVA文件锁

项目使用到集群环境,流程发送时如果确保一个流程不会被两个流程同时调用? 有一种办法是用文件锁的方式来实现。 代码如下: 锁接口: Java代码   package lock;      import java.io.FileNotFoundException;   import java.io.IOException;      public

VergiL Wang的专栏 4400

Linux文件锁的使用

文件是一种共享资源,多个进程对同一文件进行操作的时候,必然涉及到竞争状态,因此引入了文件锁实现对共享资源的访问进行保护的机制,通过对文件上锁, 来避免访问共享资源产生竞争状态。

qq_42174306的博客 4312

NFS中的文件锁

文件锁是保持文件同步的一种手段,当多个用户同时操作同一个文件时,文件锁可以保证数据不发生冲突。NFSv2和NFSv3依靠NLM协议实现文件锁,NFSv4本身实现了文件锁,不需要NLM协同工作了。NFS中的文件锁既可以加在客户端,也可以加在服务器端。如果客户端挂载NFS文件系统时使用了选项nolock,表示在客户端加锁。这种情况下可以保证同一个客户端的多个进程访问同一个文件的过程不发生冲突,但是不同

ycnian 2万+

文件锁(一)——文件锁的概述

文件锁的概述 文件锁也被称为记录锁,文件锁如果深耕的话,意义不大(比如文件锁起码分为了建议锁和强制性锁)。 但是深入没有意义的,因为实际开发很少用上,文件锁用到的机会不多,那为什么要学? 主要是为了对比学习各种的加锁机制,比如进程有进程信号量加锁机制,线程有线程互斥锁,线程信号量等加锁机制,学习文件锁有助于我们对比理解,对于我们后续理解驱动课程的内核锁,c++,java等库所提供的资源保护的锁机制,都是很有意义的。 另外还有一个目的,那就是练习fcntl函数的使用,因为文件锁也需要用到fcntl函数

Scroll_C的博客 3785
上一篇: 非阻塞io和IO多路转接
下一篇: socket编程:backlog值对listen连接状态的影响
wangst4321
博客等级 码龄16年 4粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值