记录锁

记录锁的功能是:当一个进程正在读或修改文件的某个部分时,它可以阻止其它进程修改同一文件区。fcntl函数可以实现这一功能。

#include <fcntl.h>

int fcntl(int fd, int cmd, ... /* arg */ );

对于记录锁,cmd是F_GETLKF_SETLKF_SETLKW,第三个参数是一个指向flock结构的指针:

struct flock {
               ...
               short l_type;    /* Type of lock: F_RDLCK,
                                   F_WRLCK, F_UNLCK */
               short l_whence;  /* How to interpret l_start:
                                   SEEK_SET, SEEK_CUR, SEEK_END */
               off_t l_start;   /* Starting offset for lock */
               off_t l_len;     /* Number of bytes to lock */
               pid_t l_pid;     /* PID of process blocking our lock
                                   (F_GETLK only) */
               ...
};

使用记录锁的规则是:多个进程在一个给定的字节上可以有一把共享的读锁,但是在一个给定字节上只能有一个进程独用的一把写锁。如果在一个给定的字节上已经有一把或多把读锁,则不能在该字节上再加写锁;如果在一个字节上已经有一把独占性的写锁,则不能再对它加任何读锁。

记录锁可以自动继承,也会自动释放,规则如下:

(1)当一个进程终止时,它所建立的锁全部释放。

(2)任何时候关闭一个描述符时,则该进程通过这个描述符可以引用的文件上的任何一把锁都被释放。

(3)由fork产生的子进程不继承父进程所设置的锁。

(4)在执行exec后,新程序可以继承原执行程序的锁。但是如果一个文件描述符设置了close-on-exec标志,那么当作为exec的一部分关闭该文件描述符时,对相应文件的所有锁都被释放了。



记录锁有建议性锁和强制性锁两种机制,它们并不是真正的锁,而是一种能对记录锁效果产生影响的机制。

建议性锁:每个使用文件的进程都要主动检查该文件是否有锁存在,当然都是通过具体锁的API,比如fcntl记录锁F_GETTLK来主动检查是否有锁存在。如果有锁存在并被排斥,那么就主动保证不再进行接下来的IO操作。如果每一个进程都主动进行检查,并主动保证,那么就说这些进程都以一致性的方法处理锁。但是,不主动判断这个文件有没有加上记录锁,就直接对这个文件进行IO操作,会怎么样呢?这种有破坏性的IO操作会不会成功呢?如果是在建议性锁的机制下,这种破坏性的IO就会成功。因为锁只是建议性存在的,并不强制执行。

强制性锁:文件记录锁功能由内核执行。上述提到的破坏性IO操作会被内核禁止。当文件被加锁来进行读写操作时,在锁定该文件的进程释放该锁之前,内核会强制阻止任何对该文件的读或写违规访问,每次读或写访问都得检查锁是否存在。也就是强制性锁机制,让锁变得名副其实,真正达到了锁的效果。

Linux默认为建议性锁,开启强制性锁时,要对一个特定文件打开其设置组ID位并关闭其组执行位,如下:

$chmod g+s <FileName>
$chmod g-x <FileName>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 02:43:37

记录锁的相关文章

[13]APUE:(文件)记录锁

[a] 概念 建议锁:在遵循相同记录锁规则的进程间生效,通常用于保证某个程序自身多个进程间的数据一致性 强制锁:意在保证所有进程间的数据一致性,但不一定有效:如不能应对先 unlink 后建立同名副本的行为 [b] fcntl #include <fcntl.h> int fcntl(int fd, int cmd, struct flock *flockp) //出错返回 -1  struct flock { short l_type; //锁类型:F_RDLCK / F_WRLCK / F

记录锁(record locking)机制

要讲解记录锁机制,首先要介绍fcntl函数,如下给出该函数原型: #include <fcntl.h> int fcntl(int filedes, int cmd, ... /* struct flock *flockptr */) 函数返回值:若成功则依赖于cmd,若出错则返回-1. 对于记录锁,cmd是F_GETLK, F_SETLOCK, F_SETLKW.第三个参数(称其为flockptr)是一个指向flock结构的指针: struct flock { short l_type; /

文件记录锁的释放

引言:apue中提到文件记录锁的释放中的两条规则:当进程终止的时候,进程在文件上建立的记录锁会全部释放:当关闭文件,执行close(fd)函数的时候,进程释放描述符可以引用的文件上的任何一把锁.对于第一条规则的理解应该没有分歧.但对于第二条规则的理解,则会出现疑惑,执行close(fd)的时候,是仅仅释放closf(fd)调用进程在文件上的记录锁,还是会释放所有进程(包括非调用进程)在文件上的记录锁.本文通过具体相关程序对此问题进行验证. 思路:需要设计验证程序对此问题进行验证,通过fork产生

SylixOS文件记录锁使用

1. 文件记录锁介绍 文件锁锁定的是整个文件,而记录锁定还可以锁定文件的某一特定部分,即从文件的某一相对位置开始的一段连续的字节流. 当一个进程正在读取或者修改文件的某个部分时,使用文件记录锁可以阻止其他进程修改同一文件的相同区域.它可以用来锁定文件的某个区域或者整个文件,SylixOS 支持多种文件记录锁 API. 注:SylixOS 支持多种设备驱动模型,但是目前只有 NEW_1 型设备驱动支持文件记录锁功能,此类驱动文件节点类似于UNIX 系统的 vnode. 2. 文件记录锁设置 Syl

Linux环境编程之高级I/O(一):非阻塞I/O、记录锁

引言:高级I/O包括非阻塞I/O.记录锁.系统V流机制.I/O多路转接(select和poll函数).readv和writev函数以及存储映射I/O. (一)非阻塞I/O 可能会使进程永远阻塞的一类系统调用有: 1.如果某些文件类型的数据并不存在,则读操作可能会使调用者永远阻塞. 2.如果数据不能立即被上述同样类型的文件接受,则写操作也会使调用者永远阻塞. 3.在某种条件发生之前,打开某些类型的文件会阻塞. 4.对已经加上强制记录锁的文件进行读.写. 5.某些ioctl操作. 6.某些进程间通信

Linux IPC 同步(三):记录锁

进程间的互斥,我们可以让这些进程共享某个内存区(mmap实现),然后在该共享内存区中使用某种类型的同步变量 但是,fcntl记录上锁往往更容易使用. #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* struct flock *arg */ ); struct flock { ... short l_type; /* Type of lock: F_RDLCK, F_WRLCK, F_U

unix 中的记录锁

如果一个文件被两个人同时修改会出现什么结果呢?在很多unix系统中,该文件的最后状态取决于写该文件的最后一个进程.但是对于有些应用程序(例如数据库),进程有时需要确保它正在单独写一个文件.为了向进程提供这种功能,商用unix系统提供了记录锁机制. 记录锁的功能是:当一个进程正在读或修改文件的某个部分时,它可以组织其他进程修改同一文件区.对于unix系统而言,"记录"这个次是一种误会,因为unix系统内核根本没有使用文件记录这种概念.更适合的术语可能是"字节范围锁",

Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select for update/lock in share mode 对事务并发性影响 Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解 Mysql加锁过程详解(6)-数据库隔离级别(1) Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别 Mysql加锁过程详解

推荐:mysql锁 innodb下的记录锁,间隙锁,next-key锁

你需要知道的 之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁. 行锁 记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁. 生活中的间隙锁 编程的思想源于生活,生活中的例子能帮助我们更好的理解一些编程中的思想. 生活中排队的场景,小明,小红,小花三个人依次站成一排,此时,如何让新来的小刚不能站在小红旁边,这时候只要将小红和她前面的小明之间的空隙封锁,将小红和她后面的小花之间的空隙封锁,那么小刚就不能站到小红的旁边. 这里的小红,小明