Linux高级程序_IO操作_lock

1文件锁定设计原理

1.1文件锁定类型

  • 强制锁Mandatory lock:内核相关,较为底层
  • 建议锁Advisory lock:用户层面,

1.2文件锁结构

  • kernel源码 fs.h→file_lock

2文件锁定函数调用方法

2.1 fcntl函数

记录锁函数 int fcntl(int fildes,int cmd,struct flock*arg);
成功返回非负整数,失败-1
头文件:<unistd.h>,<fcntl.h>

cmd:

  • F_GETLK //得到锁
  • F_SETLK //设置锁
  • F_SETLKW //设置锁并等待返回
struct flock{
	short l_type;//锁类型,F_RDLCK(共享锁),F_WRLCK(独占锁),F_UNLCK(释放锁)
	short l_wherece;//锁区域开始地址的相对位置,类似于lseek中whence参数
	long l_start;//锁区域开始地址偏移量,同l_whence共同确定锁区域
	long l_len;//锁的长度,0表示锁至文件末
	long l_pid;//拥有锁的进程ID号
};
默认为建议锁,需要强制锁需要重新挂载
sudo mount -oremount,mand/  //重新挂载根目录
sudo chmod g+s,g-x[filename]

实例:
写一个hello.txt内容为 tc1111
编写独占锁执行文件file_lock.c 其中while(1){rd++};相当于让hello.txt一直在更改rd数值,hello.txt一直被占用。
在这里插入图片描述
并且编译对hello.txt上独占锁,由于默认为建议锁位用户层面,若需要独占锁,则需要

  • sudo mount -oremount,mand/ //重新挂载根目录
  • sudo chmod g+s,g-x[filename]
  • 执行file_lock之后,控制台1返回锁值0,表明上锁成功在这里插入图片描述
    切换至控制台2,cat hello.txt 查看内容发现无法读取内容,这是因为hello.txt在控制台1一直处于执行状态,反复进行对hello.txt执行rd++操作,而hello.txt又是设定为独占锁,则控制台2对hello.txt同时进行查看操作会阻塞
    在这里插入图片描述
    切换至控制台1,执行ctrl+c,强制退出命令执行,结束控制台1对hello.txt的操作。
    在这里插入图片描述
    之后切换至控制台2,发现控制台2已经读出了hello.txt的内容,因为控制台1已经没有对hello.txt进行操作
    在这里插入图片描述

2.3flock(较为上层,对fcntl函数的封装)

int flock(int fd,int operation);
operation:
LOCK_SH //共享锁
LOCK_EX //独占锁
LOCK_UN //释放锁

3线程锁定

void flockfile(FILE *stream)
void ftrylockfile(FILE *stream)
void funlockfile(FILE *stream)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值