文件锁
进程写使用的区域有交叉就会冲突
加不上锁就不进行读写操作,能加上锁再操作
演示写冲突,开启两个终端窗口
一个./a.out hello执行a.out向文件中写入hello
一个./a.out world向文件中写入world
使用命令行参数将写入内容hello,world带到程序中
要一个一个字符写入hello,'h','e','l','l','o'
argv记录的是命令行首地址,argv[]有两个参数argv[0],argv[1]
argv[1]记录的是第二个参数hello字符串首字符'h'的地址,即argv数组第二个参数的首地址
argv[1][0]记录的是第二个参数首地址的内容'h',等价于*(argv[1])
argv[1][1]记录的是第二个参数字符串第二个字符的内容'e',等价于*(argv[1]+1)
&argv[1][1]为'e'的地址
若将argv[1]看做指针p帮助理解,p指向“hello”,*p等价于p[0],*(p+1)等价于p[1]
两个进程同时向文件shared.txt写,写冲突情况
通过加锁的方式解决冲突
fcntl函数
参数:文件描述符,阻塞模式,结构体指针(结构体中存储锁的信息)
阻塞模式:进程中,fcntl函数不结束不反回,停止在原地,等待能加上锁
非阻塞模式:加不上锁fcntl函数立马返回结束
I_whence与I_start确定锁区起点,I_len确定锁区长度
同时两终端写入
发现顺序正常
非阻塞方式加锁
同过man 2 fcntl可知,错误码为EACCES或EAGAIN时,非阻塞方式加锁失败
要用错误码,需要头文件#include<errno.h>
if为一次判断,while相当于循环判断
先执行a.out hello 后执行a.out world,非阻塞加锁失败,待前一个进程解锁后加锁成功
printf中不加\n,输出到缓冲区,程序结束后一股脑从缓冲区输出一堆
printf“\n”,缓冲区检测到\n,则一句一句从缓冲区输出
从缓冲区输出三种情况:\n,缓冲区满,程序结束
文件锁的内核结构
acess函数 访问测试
truncate函数 修改文件大小
成功写入abcde
同理ftruncate(fd,3);
增加删除都发生在文件尾部
写入两个数字0对应的字符为"\0",txt显示的是字符
GDB调试的是可执行程序,主要用来看程序运行的过程