加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux数据管理学习:文件锁定

发布时间:2016-10-31 01:27:29 所属栏目:Linux 来源:网络整理
导读:一、什么是文件锁定 对于锁这个字,大家一定不会陌生,因为我们生活中就存在着大量的锁,它们各个方面发挥着它的作用,现在世界中的锁的功能都可归结为一句话,

下面的源文件filelock3.c用于测试上一个文件设置的锁,测试可否对两个区域都加上一个读锁,代码如下:

#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <fcntl.h>  
      
int main()  

{  
    const char *test_file = "test_lock.txt";  
    int file_desc = -1;  
    int byte_count = 0;  
    char *byte_to_write = "A";  
    struct flock region_1;  
    struct flock region_2;  
    int res = 0;  
    //打开数据文件  
    file_desc = open(test_file, O_RDWR|O_CREAT, 0666);  
    if(!file_desc)  
    {  
        fprintf(stderr, "Unable to open %s for read/writen", test_file);  
        exit(EXIT_FAILURE);  
    }  
    //设置区域1的锁类型  
    struct flock region_test1;  
    region_test1.l_type = F_RDLCK;  
    region_test1.l_whence = SEEK_SET;  
    region_test1.l_start = 10;  
    region_test1.l_len = 20;  
    region_test1.l_pid = -1;  
    //设置区域2的锁类型  
    struct flock region_test2;  
    region_test2.l_type = F_RDLCK;  
    region_test2.l_whence = SEEK_SET;  
    region_test2.l_start = 40;  
    region_test2.l_len = 10;  
    region_test2.l_pid = -1;  
    //对区域1的是否可以加一个读锁进行测试  
    res = fcntl(file_desc, F_GETLK, ion_test1);  
    if(res == -1)  
    {  
        fprintf(stderr, "Failed to get RDLCKn");  
    }  
    if(region_test1.l_pid == -1)  
    {  
        //可以加一个读锁  
        printf("test: Possess %d could lockn", getpid());  
    }  
    else
    {  
        //不允许加一个读锁  
        printf("test:Prossess %d  get lock failuren", getpid());  
    }  
      
    //对区域2是否可以加一个读锁进行测试  
    res = fcntl(file_desc, F_GETLK, ion_test2);  
    if(res == -1)  
    {  
        fprintf(stderr, "Failed to get RDLCKn");  
    }  
    if(region_test2.l_pid == -1)  
    {  
        //可以加一个读锁  
        printf("test: Possess %d could lockn", getpid());  
    }  
    else
    {  
        //不允许加一个读锁  
        printf("test:Prossess %d  get lock failuren", getpid());  
    }  
    exit(EXIT_SUCCESS);  
}

运行结果如下:

Linux数据管理学习:文件锁定

因为区域1中存在的是读锁,所以在其之上再加一个读锁是可以成功的,然而区域2上存在的锁是写锁,在其上不能加任何类型的锁,所以测试失败。注意,测试失败并不是fctnl调用失败,它还是返回非-1,我们是通过检查flock结构的成员l_pid来确定测试结果的。

三、解空锁问题

如果我要给在本进程中没有加锁的区域解锁会发生什么事情呢?而如果这个区域中其他的进程有对其进行加锁又会发生什么情况呢?

如果一个进程实际并未对一个区域进行锁定,而调用解锁操作也会成功,但是它并不能解其他的进程加在同一区域上的锁。也可以说解锁请求最终的结果取决于这个进程在文件中设置的任何锁,没有加锁,但对其进行解锁得到的还是没有加锁的状态。

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读