欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

详解Linux文件锁flock

程序员文章站 2023-11-16 10:09:16
在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock。 flock,建议性...

在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock。

flock,建议性锁,不具备强制性。一个进程使用flock将文件锁住,另一个进程可以直接操作正在被锁的文件,修改文件中的数据,原因在于flock只是用于检测文件是否被加锁,针对文件已经被加锁,另一个进程写入数据的情况,内核不会阻止这个进程的写入操作,也就是建议性锁的内核处理策略。

flock主要三种操作类型:

  • lock_sh,共享锁,多个进程可以使用同一把锁,常被用作读共享锁;
  • lock_ex,排他锁,同时只允许一个进程使用,常被用作写锁;
  • lock_un,释放锁;

进程使用flock尝试锁文件时,如果文件已经被其他进程锁住,进程会被阻塞直到锁被释放掉,或者在调用flock的时候,采用lock_nb参数,在尝试锁住该文件的时候,发现已经被其他服务锁住,会返回错误,errno错误码为ewouldblock。即提供两种工作模式:阻塞与非阻塞类型。

服务会阻塞等待直到锁被释放:

flock(lockfd,lock_ex)

服务会返回错误发现文件已经被锁住时:

ret = flock(lockfd,lock_ex|lock_nb)

同时ret = -1, errno = ewouldblock

flock锁的释放非常具有特色,即可调用lock_un参数来释放文件锁,也可以通过关闭fd的方式来释放文件锁(flock的第一个参数是fd),意味着flock会随着进程的关闭而被自动释放掉。

flock其中的一个使用场景为:检测进程是否已经存在;

int checkexit(char* pfile)
{
  if (pfile == null)
  {  
    return -1; 
  }  
  int lockfd = open(pfile,o_rdwr);
  if (lockfd == -1) 
  {  
    return -2; 
  }  
  int iret = flock(lockfd,lock_ex|lock_nb);
  if (iret == -1) 
  {  
    return -3; 
  }  

  return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。