文件在共享情况下,为了避免竞争的状态,通常采用给文件上锁的方法。文件锁包括建议性锁和强制性锁,
建设性锁要求进程要判断是否有锁存在,才采取相应措施。强制性锁在内核中使用,一旦文件有写入锁,内核将阻止其被写入操作。常用函数fcntl(),同时此函数还可以对文件中一记录上锁,称为记录锁(读取锁,写入锁)。
fcntl()函数格式
头文件:
<ysy/types.h>
<unistd.h>
<fcntl.h>
原型:
int fcntl(int fd,int cmd, struct flock *lock)
cmd :
F_DUPFD 复制文件
F_GETFD
F_SETFD
F_DETFL
F_GETLK 根据lock描述,决定是否上文件锁
F_SETLK 设置lock描述的文件锁
F_SETLKW 阻塞的F_ETLK
lock :
struct flock
{
short l_type; (F_RDLCK:读锁;F_WRLCK:写入锁;F_UNLCK:解锁)
off_t l_start 文件中的相对位移量
short l_whence 相对位移量起点,SEEK_SET,SEEK_CUR,SEEK_END
off_t l_len 加锁区域长度
pid_t l_pid 拥有文件锁的进程id号
}
返回值:成功 :0
失败: -1
写入锁为互斥锁
读取锁为共享锁
图片是测试代码