一 代码
#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