1、概述
记录锁是读写锁的一种扩展类型,可用于亲缘关系或无亲缘关系的进程之间共享某个文件的读与写。被锁住的文件通过文件描述符进行访问,执行上锁的操作函数是fcntl,这种类型的锁通常在内核中维护。
记录锁的功能是:一个进程正在读或修改文件的某个部分时,可以阻止其他进程修改同一文件区,即其锁定的是文件的一个区域或整个文件。记录锁有两种类型:共享读锁,独占写锁。基本规则是:多个进程在一个给定的字节上可以有一把共享的读锁,但在一个给定字节上的写锁只能有一个进程独用。即:如果在一个给定的字节上已经有一把读或多把读锁,则不能在该字节上再加写锁;如果在一个字节上已经有一把独占性的写锁,则不能再对它加任何读锁。
采用Uinx打印假脱机处理系统举例说明记录锁的作用。打印假脱机处理系统使用技巧是给每台打印机准备一个文件,它只是一个单行执行的ASCII文本文件,其中还有待用的下一个序列号,需要给某个打印作业赋一个序列号的每个进程都得经历以下三个步骤:
(1)读序列号文件
(2)使用其中的序列号
(3)给序列号加1并写回文件中
存在问题:当某个进程在执行这个三个步骤时,另一个进程可能在执行同样的三个步骤,这将导致结果混乱。
解决办法:一个进程能够设置某个锁,以宣称没有其他进程能够访问相应的文件,直到第一个进程完成访问为止。
先来看看一下不上锁的影响,程序如下:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <fcntl.h>
6 #include <errno.h>
7
8 #define SEQFILE "seqno"
9 #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
10 #define MAXLINE 1024
11 void my_lock(int fd);
12 void my_unlock(int fd);
13
14 int main(int argc,char *argv[])
15 {
16 int fd;
17 long i;
18 ssize_t n;
19 char line[MAXLINE+1];
20 fd = open(SEQFILE,O_RDWR,FILE_MODE);
21 //执行两万次
22 for(i=0;i<20000;++i)
23 {
24 my_lock(fd);
25 lseek(fd,0L,SEEK_SET);
26 n = read(fd,line,MAXLINE);
27 line[n] = '