Linux数据管理学习:文件锁定

一、什么是文件锁定

对于锁这个字,大家一定不会陌生,因为我们生活中就存在着大量的锁,它们各个方面发挥着它的作用,现在世界中的锁的功能都可归结为一句话,就是阻止某些人做某些事,例如,门锁就是阻止除了屋主之外的人进入这个房子,你进入不到这个房子,也就不能使用房子里面的东西。

而因为程序经常需要共享数据,而这通常又是通过文件来实现的,试想一个情况,A进程正在对一个文件进行写操作,而另一个程序B需要对同一个文件进行读操作,并以读取到的数据作为自己程序运行时所需要的数据,这会发生什么情况呢?进程B可能会读到错乱的数据,因为它并不知道另一个进程A正在改写这个文件中的数据。

为了解决类似的问题,就出现了文件锁定,简单点来说,这是文件的一种安全的更新方式,当一个程序正在对文件进行写操作时,文件就会进入一种暂时状态,在这个状态下,如果另一个程序尝试读这个文件,它就会自动停下来等待这个状态结束。Linux系统提供了很多特性来实现文件锁定,其中最简单的方法就是以原子操作的方式创建锁文件。

用回之前的例子就是,文件锁就是当文件在写的时候,阻止其他的需要写或者要读文件的进程来操作这个文件。

二、创建锁文件

创建一个锁文件是非常简单的,我们可以使用open系统调用来创建一个锁文件,在调用open时oflags参数要增加参数O_CREAT和O_EXCL标志,如file_desc = open("/tmp/LCK.test", O_RDWR|O_CREAT|O_EXCL, 0444);就可以创建一个锁文件/tmp/LCK.test。O_CREAT|O_EXCL,可以确保调用者可以创建出文件,使用这个模式可以防止两个程序同时创建同一个文件,如果文件(/tmp/LCK.test)已经存在,则open调用就会失败,返回-1。

如果一个程序在它执行时,只需要独占某个资源一段很短的时间,这个时间段(或代码区)通常被叫做临界区,我们需要在进入临界区之前使用open系统调用创建锁文件,然后在退出临界区时用unlink系统调用删除这个锁文件。

注意:锁文件只是充当一个指示器的角色,程序间需要通过相互协作来使用它们,也就是说锁文件只是建议锁,而不是强制锁,并不会真正阻止你读写文件中的数据。

可以看看下面的例子:源文件文件名为filelock1.c,代码如下:

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

int main()
{
    const char *lock_file = "/tmp/LCK.test1";
    int n_fd = -1;
    int n_tries = 10;  

    while(n_tries--)
    {
                //创建锁文件
        n_fd = open(lock_file, O_RDWR|O_CREAT|O_EXCL, 0444);
        if(n_fd == -1)
        {
                        //创建失败
            printf("%d - Lock already present\n", getpid());
            sleep(2);
        }
        else
        {
                        //创建成功
            printf("%d - I have exclusive access\n", getpid());
            sleep(1);
            close(n_fd);
                        //删除锁文件,释放锁
            unlink(lock_file);
            sleep(2);
        }
    }
    return 0;
}

同时运行同一个程序的两个实例,运行结果为:

从运行的结果可以看出两个程序交叉地对对文件进行锁定,但是真实的操作却是,每次调用open函数去检查/tmp/LCK.test1这个文件是否存在,如果存在open调用就失败,显示有进程已经把这个文件锁定了,如果这个文件不存在,就创建这个文件,并显示许可信息。但是这种做法有一定的缺憾,我们可以看到文件/tmp/LCK.test1被创建了很多次,也被unlink删除了很多次,也就是说我们不能使用已经事先有数据的文件作为这种锁文件,因为如果文件已经存在,则open调用总是失败。

给我的感觉是,这更像是一种对进程工作的协调性安排,更像是二进制信号量的作用,文件存在为0,不存在为1,而不是真正的文件锁定。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, 数据
, 程序
, 进程
, open
, 文件锁
, open创建文件ntfslinuxwrite
一个
,以便于您获取更多的相关知识。

时间: 2025-01-27 03:19:07

Linux数据管理学习:文件锁定的相关文章

Linux下脚本文件的seq的学习

问题描述 Linux下脚本文件的seq的学习 B=seq -s " " -f"iconback%02g" 1 $A C=seq -s " " -f"img%0g" 1 $A 请问哪位知道如何让B,C 打印出来的值一一对应,例如:img1="iconback01",img2="iconback02".... 解决方案 seq没法支持两个变量,用awk来 awk 'BEGIN { for(i

Linux如何搜索文件的方法

  在Linux上查找某个文件是一件比较麻烦的事情.毕竟在Linux中需要我们使用专用的"查找"命令来寻找在硬盘上的文件. Linux下的文件表达格式非常复杂,不象WINDOWS,DOS下都是统一的AAAAAAA.BBB格式,那么方便查找,在WINDOWS中,只要知道要查找的文件的文件名或者后缀就非常容易查找到.Linux中查找文件的命令通常为"find"命令,"find"命令能帮助我们在使用,管理Linux的日常事务中方便的查找出我们需要的文件

Linux桌面用户文件夹开启密码保护教程

  我的 Windows PC 及磁盘是采用 BitLocker 加密的,这种加密方式对用户来说是透明的;我的 Ubuntu 笔记本也没对任何文件夹进行加密,因为我的电脑只是私人使用,似乎没必要隐藏任何文件. 但还是有很多朋友有对 Linux 文件夹进行密码保护这一需求的,下面我们就一起来看下如何使用密码保护 Linux 桌面用户文件夹安全. 密码保护Lniux桌面用户文件夹 由于我个人的使用习惯,所以使用 Ubuntu 系统进行示例说明,本文的步骤同样适用于基于 Ubuntu 的发行版,如:L

与 Linux 一起学习:学习音乐

与 Linux 一起学习:学习音乐 "与 Linux 一起学习"的所有文章: 与 Linux 一起学习:学习打字 与 Linux 一起学习:学习物理 与 Linux 一起学习:学习音乐 与 Linux 一起学习:学习地理 与 Linux 一起学习:学习数学 引言:Linux 提供大量的教学软件和工具,面向各个年级段以及不同年龄段,提供大量学科的练习实践,其中大多数是可以与用户进行交互的.本"与 Linux 一起学习:"系列就来介绍一些教学软件. 学习音乐是一个很好的

如何使用密码保护Linux桌面用户文件夹

如何使用密码保护 Linux 桌面用户文件夹安全呢?想必很多朋友都会遇到类似问题.Linux 和 Windows 一样是多用户系统,如果你的 Linux 电脑要与别人共用或不时需要借给他人,里面又放有很重要的商业文档.技术方案等内部资料,肯定是不希望被别人看到的,如果存有英语听力.金刚葫芦娃等私人文件,更是怕别人使用时看到尴尬. 我的 Windows PC 及磁盘是采用 BitLocker 加密的,这种加密方式对用户来说是透明的:我的 Ubuntu 笔记本也没对任何文件夹进行加密,因为我的电脑只

5 个在 Linux 中管理文件类型和系统时间的有用命令

对于想学习 Linux 的初学者来说要适应使用命令行或者终端可能非常困难.由于终端比图形用户界面程序更能帮助用户控制 Linux 系统,我们必须习惯在终端中运行命令.因此为了有效记忆 Linux 不同的命令,你应该每天使用终端并明白怎样将命令和不同选项以及参数一同使用. 在 Linux 中管理文件类型和设置时间 请先查看我们 Linux 小技巧系列之前的文章: 5 个有趣的 Linux 命令行技巧 给新手的 10 个有用 Linux 命令行技巧 在这篇文章中,我们打算看看终端中 5 个和文件以及

Linux命名空间学习教程(五)NET

本文讲的是Linux命名空间学习教程(五)NET,[编者的话]Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源.而 LXC所实现的隔离性主要是来自内核的命名空间, 其中pid.net.ipc.mnt.uts 等命名空间将容器的进程.网络.消息.文件系统和hostname 隔离开.本文是Linux命名空间系列教程的第五篇,重点介绍NET命名空间.DockerOne在撸代码的基础上进行了校对和整理. 阅读完上一篇关于NS namespac

Linux LVM学习总结&amp;mdash;&amp;mdash;创建卷组VG

    在Linux平台如何创建一个卷组(VG)呢?下面简单介绍一下卷组(VG)的创建步骤.本文实验平台为Red Hat Enterprise Linux Server release 6.6 (Santiago) 1: 查看当前卷组信息 查看服务器的卷组(VG).物理卷(PV).逻辑卷(LV)相关信息,在此之前,我们先来看看一些基本命令以及用法     vgcan命令介绍 :     查找系统中存在的LVM卷组,并显示找到的卷组列表.vgscan命令仅显示找到的卷组的名称和LVM元数据类型,要

Linux中RPM文件操作的常用命令总结_Linux

简介 众所周知在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的"添加/删除程序",但是功能又比"添加/删除程序"强很多,它就是Red Hat Package Manager(简称RPM).本文介绍的就是关于Linux中RPM文件操作的常用命令,下面话不多说,来一起看看吧. 一.RPM 安装操作 命令: rpm -i 需要安装的包文件名 举例如下: rpm -i example.rpm 安装 example.rpm 包: rpm -iv e