Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2633875
  • 博文数量: 333
  • 博客积分: 4817
  • 博客等级: 上校
  • 技术积分: 4413
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-28 10:51
文章分类

全部博文(333)

文章存档

2017年(20)

2016年(57)

2015年(27)

2014年(20)

2013年(21)

2012年(164)

2011年(24)

分类: LINUX

2011-11-12 13:59:27

1 .记录锁的功能

       当一个进程正在读或修改文件的某个部分时,它可以阻止其他进程修改同一文件区。我们不应该从字面上去理解记录锁,实际上它应该叫“区域锁”,因为它锁定的只是文件的一个(也可能是整个文件)。这个区域用来存放多用户的共享区。

2 .记录锁的分类

       记录锁分为共享读锁和独占写锁,前者也叫做共享锁后者也叫做排他锁。

3 .加锁规则

       如果一个进程对共享区加了共享读锁,其他进程只能加共享读锁。如果一个进程加了独占写锁,其他进程就不能加任何锁。

4 .死锁

       如果两个相互等待对方持有并且不释放(已被锁定)的资源是时,则这两个进程就处于死锁状态。如果一个进程已经控制了文件的一个加锁区域,然后它又试图对另一个进程控制的区域加锁,则它就会睡眠,在这种情况下,有发生死锁的可能性。

5 .锁的隐含继承和释放

( 1 )锁与进程和文件两方面有关系,它和前者关系是:当一个进程结束后,他对文件加的锁也就消失了。它和后者的关系是:当进程 close 文件描述符,切断文件和进程的联系进程所创建的锁也会消失。

( 2 )由 fork 产生的子进程不继承父进程所设置的锁。这意味着,若一个进程得到一把锁,然后调用 fork ,那么对于父进程创建的锁而言,子进程被视为另一个进程,不会拥有该锁。

( 3 )在执行 exec 后,新进程可以继承原执行的锁。因为执行 exec 前后还是一个进程。我们只是改变进程执行的程序,并没有创建新的进程。

6 .要注意的问题

    记录锁只是提供竞争进入某段代码区的功能,不会导致对文件操作失败。也就是说,我们对文件进行加锁后,我们还是可以对文件进行操作。

 

1 .

名称 : :
 fcntl
 
功能 :
 对文加解锁。
 
头文件 :
 #include
 
函数原形 :
 int fcntl(int filedes,int cmd,…/*struct flock *flockptr */) ;
 
参数 :
 filedes   文件描述符

cmd     测试锁或加锁

flockptr  指向 flock 结构的指针
 
返回值:
 若成功返回 0 ,若失败返回错误编号。 
 
1

名称 :

fcntl

功能

对文加解锁。

头文件

#include

函数原形

int fcntl(int filedes,int cmd,…/*struct flock *flockptr */)

参数

filedes   文件描述符

cmd     测试锁或加锁

flockptr  指向 flock 结构的指针

返回值:

若成功返回 0 ,若失败返回错误编号。

 

 

 

 

 

 

  对于记录锁, cmd 是 F_GETLK,F_SETLKW 或 F_SETLKW. 。

       F_GETLK 判断由 flockptr 所描述的锁是否会被另外一把锁排斥。如果存在一把锁,他阻止创建由 flockptr 所描述的锁,则把该现存锁的信息写到 flockptr 指向的结构中。如果不存在这种情况除了将 l_type 设置为 F_UNLCK 之外, flockptr 所描述的其他信息都不变。

F_SETLK 和 F_SETLKW 企图建立一把锁。 F_SETLK 和 F_SETLKW 的区别是 F_SETLKW 是 F_SETLK 的阻塞版本。如果存在其他锁,调用的进程就被阻塞直道捕捉到信号。

       第三个参数是一个指向 flock 结构的指针:

struct flock{

       short l_type; /*F_RDLCK,F_WRLCK,F_UNLCK*/

       off_t l_start; /* 加锁的地址 */

       shout l_whence; /* 加锁的偏移地址 */

       off_t l_len; /* 加锁区域的长度 */

       pid_t l_pid; /* 持有锁的进程 ID*/

};

flock 结构说明:

所希望的锁类型: F_RDLCK( 共享读锁 ) 、 F_WRLCK( 独占性写锁 ) 、 F_UNLCK( 解锁一个区域 ) ,这是由 l_type 决定的。

要加锁或解锁区域的起始字节偏移量,这是由 l_statt 和 l_whence 两者决定。

区域的字节长度,由 l_len 表示。

具有能阻塞当前进程的锁,其持有的 ID 存放在 l_pid 中。

       如若 l_len 为 0 ,则表示锁的区域从其起点(由 l_start 和 l_whence 决定)开始直至最大可能位置为止。也就是不管添写到该文件中多少数据,它都处于的范围。

       如果想锁住整个文件,通常的方法是将 l_start 说明为 0 , l_whence 说明为 SEEK_SET , 1_len 说明为 0 。

       还要注意的是,对文件加共享读锁时文件应以只读的方式打开,对文件加独占写锁时文件应以只读的方式打开。


附加:
共享锁【S锁】又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。排他锁【X锁】又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhengzhoudaxue2/archive/2010/12/29/6105738.aspx

阅读(1141) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~