Linux文件锁

编程

劝告锁:内核只提供加锁以及检测文件是否已经加锁的手段,但是内核并不参与锁的控制和协调。因此,劝告锁并不能阻止进程对文件的访问,而只能依靠各个进程在访问文件之前检查该文件是否已经被其他进程加锁来实现并发控制。

强制锁:与劝告锁不同,强制锁是一种内核强制采用的文件锁。如果有进程不遵守游戏规则,硬要往加了锁的文件中写入内容,内核就会加以阻拦

channel.lock()对应Linux上fcntl(4, F_SETLKW, {l_type=F_WRLCK, l_whence=SEEK_SET, l_start=0, l_len=0}) = 0 阻塞方式进行文件级别的排它锁。但是是劝告锁还是强制锁?需要文件系统的支持

判断文件是否被加强制锁

1.修改要加强制锁的文件的权限:设置 SGID 位,并清除组可执行位。这种组合通常来说是毫无意义的,系统用来表示该文件被加了强制锁。例如:

# touch /mnt/testfile

# ls -l /mnt/testfile

-rw-r--r-- 1 root root 0 Jun 22 14:43 /mnt/testfile

# chmod g+s /mnt/testfile

# chmod g-x /mnt/testfile

# ls -l /mnt/testfile

-rw-r-Sr-- 1 root root 0 Jun 22 14:43 /mnt/testfile

lslocks

lslocks可以列出所以加锁的文件

COMMAND           PID  TYPE SIZE MODE  M START END PATH

mysqld 1022 POSIX 96K WRITE 0 0 0 /var/lib/mysql/mysql/servers.ibd

java 1799 POSIX 278B WRITE 0 0 0 /media/sf_data/IdeaProjects/DemoTest/person.txt

上面结果可以看出,我使用了java的FileLockperson.txt对整个文件加上了排他的劝告锁。

  1. 文件级锁还是记录锁:START 和 END看出

  2. 共享还是排他:MODE中看出,这里是WRITE因此是排他。如果是读就是共享

  3. M 应该是强制锁还是劝告锁。0表示不是强制锁。

还有的办法就是,使用vim去编辑,如果写成功说明加的是劝告锁

参考:

必读 Linux 2.6 中的文件锁: https://www.ibm.com/developerworks/cn/linux/l-cn-filelock/index.html

Linux 的进程间通信:文件和文件锁 https://cloud.tencent.com/developer/article/1005555

以上是 Linux文件锁 的全部内容, 来源链接: utcz.com/z/516197.html

回到顶部