Perl 文件锁定

Perl 文件锁定

文件锁定,或一般的锁定,只是为处理与资源共享有关的问题而提出的各种解决方案之一。 文件锁定是一种保护任何文件的安全和完整性的方法。文件锁定的主要动机是允许人们在不造成混乱的情况下对文件进行修改。当一个文件试图被两个或更多的用户修改时,可能会出现冲突。

例如,让我们考虑一个包含项目数据的文件。整个项目组都被允许修改该文件。将有一个CGI脚本在网络上编码,做以下事情。

$file = "project.docx";
$commit = $ENV{'QUERY_INFO'};
open(FILE, "$file"); #opening the document
while() {
  if (m/^$commit$/) {
    print "Change already made\n";
    exit;
  }
}
close(FILE);
push(@newcommit, $commit);
open(FILE, ">$file");
print ...
close(FILE);
print "Commit made!";
exit;

文件的锁定是在系统层面上进行的,这意味着应用锁的实际细节不是用户需要担心的。文件锁的引入是为了对某些文件设置临时限制,以限制它们在不同进程中的共享方式。根据操作的性质,我们提出了两种类型的锁。第一种类型是共享锁,另一种是独占锁。就文件而言,读取访问可以由多个进程共享,因为读取访问不会导致共享资源的状态发生任何变化。因此,可以保持共享资源的一致视图。
在Perl中,文件锁可以通过 flock 命令来完成。

flock()
flock() 接受两个参数。第一个参数是文件柄。第二个参数表示所需的锁定操作。

语法 :

flock [FILEHANDLE], [OPERATION].

这里, OPERATION 是一个数值,它可以是 1248。

这些数值有不同的含义,用于执行不同的操作,例如。

lock_sh
lock_ex
lock_nb
lock
_
un

Perl使用数字来表示这些数值。

sub LOCK_SH { 1 }## 设置为共享锁  
sub LOCK_EX { 2 }## 设置为独占锁  
sub LOCK_NB { 4 }## 设置没有任何区块的锁  
sub LOCK_UN { 8 }## 解除对FILEHANDLE的锁定 
  • 共享锁:

    当你只是想读取文件时,可以应用共享锁,同时也允许其他人在旁边读取同一个文件。共享锁不仅设置了一个锁,而且它首先检查其他锁的存在。这个锁不包括对所有锁的存在检查,而只包括 “独占锁”。如果独占锁存在,它就会等待,直到该锁被移除。删除后,它将作为共享锁被执行。可能同时存在多个共享锁。

    语法

flock(FILE, 1); #从上面的代码

  • EXCLUSIVE LOCK

    当文件要在一群人中使用,并且每个人都有权限进行更改时,就会使用独占锁。一个文件上只有一个独占锁,因此每次只有一个用户/进程可以进行修改。在独占锁中,规则是 “我是唯一的一个。”flock()在脚本中寻找任何其他类型的锁。如果发现了,它就会坚持下去,直到所有的锁都被从脚本中移除。在适当的时候,它会锁定文件。

    语法

flock(FILE, 2); #从上面的代码中可以看出

  • 非阻塞
  • 非阻塞锁通知系统不要等待其他锁离开文件。如果在该文件中发现了其他锁,它将返回一个错误信息。

    语法

flock(FILE, 4); #从上面的代码中可以看出

  • UNBLOCKING

    解除对任何指定文件的封锁–与close(FILE)函数的作用相同。

    语法

flock(FILE, 8); #从上面的代码中

可以看出

下面讨论的是一个问题,它解释了 flock() 函数的使用:

问题:

上面例子中解释的脚本的主要问题是当它打开文件 -project.docx 时,清除了第一个文件并使其为空。

想象一下,A、B、C三个人几乎在同一时间试图进行提交。

A君打开文件,检查数据。关闭它,然后开始编辑数据。(清除第一个文件)

同时,人B打开文件检查/阅读,注意到它是完全空的。

这就是一个冲突!整个系统将被打乱。

解决方案:

这就是使用 文件锁 的地方。人A、B、C都愿意对文件进行提交。A君打开文件,那一刻(共享锁被激活),检查出文件中的所有数据,然后再次关闭文件(解锁)。

A君随后希望提交对文件的修改,并重新打开文件进行编辑(这时专属锁开始起作用)。当人A对文件进行修改时,人B或人C都不能打开文件进行读写。

人A完成他的工作,关闭文件(解锁)。

现在,如果B试图在此期间打开该文件,将会得到一个错误–“文件正在被其他候选人访问”。
这样就不会产生踩到脚趾的情况,并保持良好的工作流。

flock() vs lockf()

lockf() 函数用于锁定文件的一部分,而flock()则不同,它可以一次锁定整个文件。lockf()不能直接在Perl中使用,而Perl本身支持flock系统调用,但不适用网络锁。

Perl还支持 fcntl() 系统调用,在Perl中提供最多锁定控制。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程