系统调用的文件锁定——建议锁和强制锁测试

一 代码

#include <fcntl.h>
#include <stdio.h>
#include <error.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    struct flock lock;  
    int res, fd = open("myfile.txt", O_RDWR | O_CREAT, 0777);  
    if (fd > 0)
    {
        lock.l_type = F_WRLCK;
        lock.l_whence = SEEK_SET;  
        lock.l_start = 0;  
        lock.l_len = 0;  
        lock.l_pid = getpid();
        res  = fcntl(fd, F_SETLK, &lock);  
        printf("return value of fcntl=%d\n", res);
        while (true)
            ;
    }
    
    return 0;
}

二 测试建议锁

第1步:第一个终端运行下面程序

[root@localhost test]# g++ test.cpp -o test
[root@localhost test]# ./test
return value of fcntl=0

第2步:第二个终端运行下面程序

[root@localhost ~]# cd /root/C++/ch04/4.9
[root@localhost 4.9]# cd test
[root@localhost test]# cat myfile.txt
[root@localhost test]# echo "hello">>myfile.txt
[root@localhost test]# cat myfile.txt
hello

开始myfile.txt是空的,我们用echo写入一个字符串hello后,内容就有了,说明修改成功了。说明,在建议锁的情况下,其他进程的确可以修改被锁的文件。因此建议锁只适合合作进程。

三 测试强制锁

1 找到myfile.txt文件的挂载点

[root@localhost test]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   40G  2.1G   38G   6% /
devtmpfs             486M     0  486M   0% /dev
tmpfs                497M     0  497M   0% /dev/shm
tmpfs                497M  6.7M  490M   2% /run
tmpfs                497M     0  497M   0% /sys/fs/cgroup
/dev/sda1           1014M  184M  831M  19% /boot
/dev/mapper/cl-home   20G   33M   20G   1% /home
tmpfs                100M     0  100M   0% /run/user/0

说明myfile.txt文件挂载在/dev/mapper/cl-root

2 通过mount命令的"-o mand"选项来挂载,并通过chmod命令将文件用户组的x权限去掉

[root@localhost test]# mount -o remount,mand /dev/mapper/cl-root
[root@localhost test]# chmod g+s,g-x myfile.txt

3 第一个终端运行下面程序

[root@localhost test]# ./test
return value of fcntl=0

4 第二个终端运行下面程序

[root@localhost test]# echo "boy" >> myfile.txt

可以发现,#提示符不出现了,说明echo命令被阻塞不动了,说明我们的强制锁生效了。

5 第一个终端用CTRL+C结束test程序

[root@localhost test]# ./test
return value of fcntl=0
^C
[root@localhost test]#

6 第二个终端阻塞解除

[root@localhost test]# echo "boy" >> myfile.txt
[root@localhost test]#

7 查看文件内容

[root@localhost test]# cat myfile.txt
hello
boy

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值