我是靠谱客的博主 发嗲时光,最近开发中收集的这篇文章主要介绍记录锁 和 fcntl函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

记录锁和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函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部