两种文件锁的区别

lockf和flock的异同

Posted by mengxun on December 2, 2020

0x01 文件锁

当代码读写文件的时候我们经常需要加上文件锁来避免竞争条件,可是lockf和flock两种文件锁并不一样;为啥要研究这个,因为最近项目里有踩这些坑,之前的老代码里对同一个锁有的用flock有的用lockf,导致锁并不生效:)

0x02 两种加锁方式的区别

  • lockf
    • 这种加锁方式可以实现只对文件某一部分(xx字节到xx字节)这种比flock更细粒度的加锁
    • 它绑定的是进程,也就是说同个进程里的lockf是不排他的..不同的进程之间调用lockf才生效(lockf是通过关联到i-node上的strcut flock实现的)
    • lockf打开的锁不会被子进程继承(flock这个struct只能有一份)
  • flock
    • 只能锁整个文件,无法只锁文件某个部分
    • 绑定的是fd,所以不同进程之间会生效(fd不同),同一进程也会生效(每次open文件都是新fd)
    • 会被子进程继承,因为子进程除了进程号和进程开始时间和父进程不同之外,其他都是复制父进程的,fd当然也在其列

另外,flock 和 lockf 同时加锁并不互斥,不会对彼此生效.

参考链接:stackoverflow