Unix C学习笔记8 文件锁

文件锁

 进程写使用的区域有交叉就会冲突

加不上锁就不进行读写操作,能加上锁再操作

演示写冲突,开启两个终端窗口

一个./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调试的是可执行程序,主要用来看程序运行的过程

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值