Unix环境文件读写锁

做个假设,如果有多个进程,共同编辑一个文件,那个这个文件安最后的结果是什么?在普通的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形式返回

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/24445.html