文件锁学习

在文件已经共享的情况下如何操作,也就是多个程序共同操作一个文件的情况,linux中通常采用的方法时给文件上锁,来解决对共享的资源的竞争。
文件锁包括:建议性锁强制性锁
建议性锁:每个相关程序在访问文件之前检查是否有锁存在,并且尊重已有的锁。一般情况下,不建议使用建议行锁,因为没法保证每个程序都会去检查是否有锁。
强制性锁:强制性锁是由内核执行的锁,当一个文件被上锁,进入写操作的时候,内核将阻止其他任何程序对该文件进行读写操作。采用强制性锁对性能影响较大,每次读写操作内核都检查是否有锁存在。
在linux中,实现文件上锁的函数有lockf()和fcntl();
lockf()用于施加建议性锁;
fcntl()用于施加强制性锁,也可以施加建议性锁。还可以对文件的某一记录上锁,也就是记录锁;记录锁又可分为读取锁和写入锁。
读取锁:又称共享锁,多个同时执行的程序允许在文件的同一部分建立读取锁;
写入锁:又称排斥锁,在任何时刻只能有一个程序在文件的某个部分建立写入锁。
显然,在文件的同一部分不能同时建立读取锁和写入锁。

fcntl(int fd,int cmd,...);

参数cmd
F_GETLK:检查文件锁状态
F_SETLK:设置lock描述的文件锁
F_SETLKW:这是F_SETLK的阻塞版本(命名中的W表示等待(wait))
返回值
成功:0
-1:出错
如果cmd和锁操作有关,则第三个参数的类型为struct *flock,其定义如下。

struct flock
{
	.....
	short l_type;
	off_t l_start;
	short l_whence;
	off_t l_len;
	pid_t l_pid;
	......
}

结构体成员含义
l_type
F_RDLCK:读取锁(共享锁)
F_WRLCK:写入锁(排斥锁)
F_UNLCK:解锁
l_start
加锁区域在文件中的相对位移(字节),与l_whence值一起决定加锁区域的起始位置。
l_start表示相对l_whence值的偏移量
l_whence
SEEK_SET:当前位置为文件的开头;
SEEK_CUR:当前位置为文件指针的位置;
SEEK_END:当前位置为文件的结尾;
l_len
加锁区域的长度
l_pid
具有阻塞当前进程的锁,其持有的进程号存放在l_pid中,仅有F_GETLK返回。
若要加锁整个文件,可以将l_start设置为0,l_whence设置为SEEK_SET,l_len设置为0。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

<( ̄︶ ̄)Okay.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值