Unix环境,文件读写锁

本文介绍了Unix环境下记录锁的概念及其实现方式,详细解释了fcntl函数及flock结构的作用,并提供了使用记录锁的实例代码。

1简介:
    做个假设,如果有多个进程,共同编辑一个文件,那个这个文件安最后的结果是什么?在普通的Unix环境下,并没有限制多个进程共同读写一个文件。但是,如果这种情况出现在数据库中,怎么办。数据库要严格限制数据的一致性。
    记录锁(Record locking)是用来描述一个进程限制其他进程来修改其在文件读写部位数据的概念。其实记录(Record)这个概念并不准确,因为在Unix下,任何文件只是字节流。
    记录锁的实现方式有多种,早期的Berkeley系列仅仅用flock方法,这个方法锁住整个文件,不是一个区域。System V Release 3通过fcntl方法,增加了记录锁的概念。这个方法提供达到整个文件安,小道一个字节的记录锁。flock建立在fcntl之上,提供了一个简单的接口。2 fcntl函数原型:
    #include <fcntl.h>
    int fcntl(int filedes, int cmd, ... /* struct flock *flockptr */ );
    Returns: depends on cmd if OK (see following), 1 on error
    fileds是要锁定的文件描述符
    对于cmd参数,可以使用的有: F_GETLK, F_SETLK, or F_SETLKW
    第三个参数(flockptr),指向一个flock结构指针,flock的结构如下:
    struct flock
    {
        short l_type;/*F_RDLCK, F_WRLCK, or F_UNLCK*/
        off_t l_start;/*相对于l_whence的偏移值,字节为单位*/
        short l_whence;/*从哪里开始:SEEK_SET, SEEK_CUR, or SEEK_END*/
        off_t l_len;/*长度, 字节为单位; 0 意味着缩到文件结尾*/
        pid_t l_pid;/*returned with F_GETLK*/
    };
    结构体描述
    锁类型: F_RDLCK(读共享锁), F_WRLCK(写互斥锁),和F_UNLCK(对一个区域解锁)
    锁开始: 锁位置(l_whence),相对于l_whence要锁或者解锁的区域开始位置(l_start)
    锁长度: 要锁的长度,字节计数(l_len)
    锁拥有者:记录锁的拥有进程ID,这个进程可以阻塞当前进程,仅F_GETLK形式返回

3对于锁区域要注意的几点
    3.1 锁可以开始或者超过文件当前结束位置,但是不可以开始或者超过文件的开始位置
    3.2 如果l_len为0,意味着锁的区域为可以到达的最大文件偏移位置。这个类型,可以让我们锁住一个文件的任意开始位置,结束的区域可以到达任意的文件结尾,并且以append方式追加文件时,也会同样上锁。
    3.3 如果要锁住整个文件,设置l_start 和 l_whence为文件的开始位置(l_start为0 l_whence 为 SEEK_SET ),并且l_len为0。
    3.4 如果有多个读共享锁(l_type of F_RDLCK),其他的读共享锁可以接受,但是写互斥锁(type ofF_WRLCK)拒绝
    3.5 如果有一个写互斥锁(type ofF_WRLCK),其他的读共享锁(l_type of F_RDLCK)拒绝,其他的写互斥锁拒绝。
    3.6 如果要取得读锁,这个文件描述符必须被打开可以去读;如果要或者写锁,这个文件的描述符必须可以被打开可以去写。
4 fcntl的cmd参数
    F_GETLK:决定以flockptr描述的锁,是否被其他的锁阻塞。
    F_SETLK :设置锁。
    F_SETLKW:对应着F_GETLK的可以阻塞的版本。w意味着wait
5 一个去写锁的例子

Fedora14 执行结果:


Parent sets write lock,pid is 2792.
In the child try to retain read lock failed,pid is 2793.
因为,在父进程中,设置了写互斥锁,所以子进程试图读共享锁时,返回失败

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值