fcntl函数linux,Linux fcntl函数 建议锁 强制锁

在多个进程访问同一个文件的时候,我们肯定不希望在一个进程写入或修改文件时,另外一个进程也可以修改文件内容,这样就乱了,Linux在底层通过加锁的方式来避免这种文件,我们可以通过fcntl函数来给文件上锁,锁又分为建议锁和强制锁,建议锁,顾名思义,相对温柔一些,在对文件进行锁操作时,会检测是否已经有锁存在,并且尊重已有的锁,但是另外的进程还可以修改文件。在一般的情况下,内核和系统都不使用建议锁。强制性的锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他进程对其进行读写操作。采取强制性的锁对性能的影响很大,每次进行读写操作都必须检查是否有锁存在,fuctl默认是建议锁,如果想用强制锁,需要重新挂载mount系统分区,我们先看看fcntl函数

函数原型

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

fd为文件描述符

cmd是一些命令参数

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

F_SETLK 设置lock参数值的文件锁

F_SETLKW 这是 F_GETLK的阻塞版本,在无法获取锁时,会进入睡眠状态

flock是一个结构体

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 加锁的长度 0 为到文件末尾

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

好了,下面来看一个例子:

31c824d9a5786f4a6a1d97fd1013a812.png

我们用一个死循环来防止这个进程死掉

59aee7ff23c490a4b4bdf4c14cfca978.png

这样这个进程就一直在执行,我们新开一个远程端,来修改hello.txt这个文件

c1b365902365f78a5276d7f4e0605c92.png

我们发现还是可以修改这个文件,这是因为fcntl函数默认是建议锁,如果想用强制锁呢,需要重新mount分区

d666bc02922c5e0a26768de61a2a74ff.png

我们再来跑一下程序

9f85e3679c4880209344ae0961552d13.png

再在另外一个远程终端修改hello.txt

08a07e2434ac67e71523049066214c77.png

我们发现他阻塞在这里了,也就是暂时不能修改了,这个时候我强制终止前一个进程

f178118558d6ae69ad3682088198dd67.png

再来看另外一个远程终端

a18dbbc587c2e0ca9d90f387e34f4190.png

发现已经修改了。

好了,Linux fcntl函数的建议锁和强制锁就总结到这里,如有问题,欢迎指正,谢谢。

0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值