概述
记录锁和fcntl函数
1 .记录锁的功能
当一个进程正在读或修改文件的某个部分时,它可以阻止其他进程修改同一文件区。我们不应该从字面上去理解记录锁,实际上它应该叫“区域锁”,因为它锁定的只是文件的一个(也可能是整个文件)。这个区域用来存放多用户的共享区。
2 .记录锁的分类
记录锁分为共享读锁和独占写锁,前者也叫做共享锁后者也叫做排他锁。
3 .加锁规则
对于不同进程:如果一个进程对共享区加了共享读锁,其他进程只能加共享读锁。如果一个进程加了独占写锁,其他进程就不能加任何锁。
同一进程:若一个进程对一个文件区加上一把锁,后来又企图在同一文件区加上一把锁,那么新锁将替代旧锁。
加锁的权限不能超过打开文件描述符的权限。
4 .死锁
如果两个相互等待对方持有并且不释放(已被锁定)的资源是时,则这两个进程就处于死锁状态。如果一个进程已经控制了文件的一个加锁区域,然后它又试图对另一个进程控制的区域加锁,则它就会睡眠,在这种情况下,有发生死锁的可能性。
5 .锁的隐含继承和释放
( 1 )锁与进程和文件两方面有关系,它和前者关系是:当一个进程结束后,他对文件加的锁也就消失了。它和后者的关系是:当进程 close 文件描述符,切断文件和进程的联系进程所创建的锁也会消失。
( 2 )由 fork 产生的子进程不继承父进程所设置的锁。这意味着,若一个进程得到一把锁,然后调用 fork ,那么对于父进程创建的锁而言,子进程被视为另一个进程,不会拥有该锁。
( 3 )在执行 exec 后,新进程可以继承原执行的锁。因为执行 exec 前后还是一个进程。我们只是改变进程执行的程序,并没有创建新的进程。
6 .要注意的问题
记录锁只是提供竞争进入某段代码区的功能,不会导致对文件操作失败。也就是说,我们对文件进行加锁后,我们还是可以对文件进行操作。
fcntl函数
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) */
};
#include <pthread.h>
int fcntl(int fd,int cmd,…/*struct flock *flockptr */) ;
出错-- -1
fd 参数--文件描述符
cmd 参数--F_GETLK--测试能不能建立一把锁,若是可以建立,l_type设置为F_UNLOCK,若是不能建立,flockptr结构体返回当前锁的信息;
--F_SETLK-- 企图建立那把锁,若是不能建立,函数出错-- -1;
--F_SETLKW--企图建立那把锁,不能建立进程就阻塞知道可以建立就唤醒进程。
flockptr 参数-- 指向 flock 结构的指针
最后
以上就是发嗲时光为你收集整理的记录锁 和 fcntl函数的全部内容,希望文章能够帮你解决记录锁 和 fcntl函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复