struct flock文件锁

1.作用

多个进程访问同一个文件,为了防止多进程访问导致的不一致,需要进行进程间同步,可以使用文件锁控制。

2.定义

fcntl是一个非常强大的函数,在这里我们可以使用它来给文件的某一个部分上锁

#include <unistd.h>
#include<fcntl.h>
int fcntl(int filedes, int cmd, ... /* struct flock *flockptr */ );

返回值:
成功:0
失败:-1,errno被设置

filedes是要操作的文件描述符,对与记录锁相关的操作,cmd只能是F_GETLK:从内核获取文件锁信息,将其保存到第三个参数, F_SETLK:设置非阻塞文件锁,第三个参数传入锁设置, 或者 F_SETLKW:设置阻塞文件锁,第三个参数传入锁设置,而第三个参数则必须是一个指向flock结构体的指针,该结构体的内部结构如下

struct flock {
    short l_type;/*F_RDLCK, F_WRLCK, or F_UNLCK */
    off_t l_start;/*offset in bytes, relative to l_whence */
    short l_whence;/*SEEK_SET, SEEK_CUR, or SEEK_END */
    off_t l_len;/*length, in bytes; 0 means lock to EOF */
    pid_t l_pid;/*returned with F_GETLK */
};

l_type 锁类型
F_RDLCK 读锁,共享锁
F_WRLCK 写锁
F_UNLCK 解锁
l_whence 加锁位置粗定位
SEEK_SET 文件开头
SEEK_CUR 文件当前位置
SEEK_END 文件末尾位置

第一个成员是加锁的类型:只读锁,读写锁,或是解锁。l_start和l_whence用来指明加锁部分的开始位置,l_len是加锁的长度,l_pid是加锁进程的进程id

如,我们现在需要把一个文件的前三个字节加读锁,则该结构体的l_type=F_RDLCK, l_start=0, l_whence=SEEK_SET, l_len=3,l_pid不需要指定,然后调用fcntl函数时,cmd参数使用F_SETLK.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值