linux 临时文件 锁,Linux 文件锁 - 首席吹牛官的个人空间 - OSCHINA - 中文开源技术交流社区...

在文已经共享的情况下如何操作,也就是当多个进程同时操作同一个文件时,我们怎么保证文件数据的正确性。linux通常采用的方法是文件上锁,来避免共享资源的产生竞争状态。

文件锁包括建议性锁和强制性的锁。建议性的,顾名思义,相对温柔一些,在对文件进行锁操作时,会检测是否已经有锁存在,并且尊重已有的锁。在一般的情况下,内核和系统都不使用建议锁。强制性的锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他进程对其进行读写操作。采取强制性的锁对性能的影响很大,每次进行读写操作都必须检查是否有锁存在。

在linux中对文件进行锁操作,可以使用lockf()和fcntl()这两个函数,前者对文件施加建议性锁,后者为两种锁都行。另外fcntl还可以对文件的某一记录上锁。

fcntl使用格式为:

int fcntl(int fd,int cmd,struct flock *lock);

fd为文件描述符,cmd为一些命令参数,flcok结构体用来设置记录锁的具体状态。

fcntl() 对已打开的文件描述符进行操作,并根据命令参数的不同能够执行不同的任务。关于文件锁的几个命令选项如下:

F_GETLK 根据lock参数值,决定是否上文件锁

F_SETLK 设置lock参数值的文件锁

F_SETLKW 这是F_GETLK的阻塞版本,在无法获取锁时,会进入睡眠状态。  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 必须是以下几个值之一( 在 unistd.h 中定义):

SEEK_SET : 文件开始位置

SEEK_CUR: 文件当前位置

SEEK_END: 文件末尾位置

l_len 加锁的长度

l_pid当前文件操作的进程id号

下面是简单的例子

c1f7e4b71a4c8eba9975854951c6c1b2.png

运行结果:

e7a16e4f70400c4ff6a2249cf95e0db1.png

读是可以共享的。

写的例子:

df6abcbbdbcc8e9979a650b1fab271c0.png

运行结果:

5fee31b6c7b5d2eba60454e8bdaa5483.png

同时写的话,发生竞争,后者不能对文件做写操作,只有当当前的锁解开,后续的才可写文件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值