公司展示网站制作,免费奖励代码网站,百度指数查询移动版,网页qq游戏怎么登陆引言在多进程环境下#xff0c;多个进程同时读写一个文件#xff0c;如果不进行同步#xff0c;就可能导致不期待的结果#xff0c;如后一个进程覆盖了前一个进程写的内容。Unix为此提供了一种强大的解决办法#xff1a;记录锁记录锁记录锁本质上就是对文件加读写锁#…引言在多进程环境下多个进程同时读写一个文件如果不进行同步就可能导致不期待的结果如后一个进程覆盖了前一个进程写的内容。Unix为此提供了一种强大的解决办法记录锁记录锁记录锁本质上就是对文件加读写锁但是它不仅可以对整个文件加锁也可以对文件的某块区域加锁这正是其强大之处。其主要由两部分构成操作类型和加锁区域struct flock{short l_type; /* 操作类型加读锁(F_RDLCK)加写锁(F_WRLCK)解锁(F_UNLCK) */// 加锁区域off_t l_start; /* 开始位置 */off_t l_len; /* 区域长度 , 为0时表示从开始位置到文件末尾的所有区域都加锁 */......
}加锁和解锁通过调用fcntl并设置cmd为F_SETLK再传入flock结构就可以加锁解锁了#include fcntl.h
int fcntl(int fd, int cmd, .../* struct flock *flockptr */);值得一提的是如果先对某块区域加了锁解锁时可以只部分解锁。当对于文件的某个区域加锁时这条加锁记录是放在vnode节点上的释放锁除了调用fcntl释放锁外还有一些隐式释放的方法。调用close关闭文件时会释放进程再这个文件上加的锁进程退出时会调用close方法关闭文件描述符也就会释放锁锁继承当fork子进程时子进程不会继承父进程加的记录锁根本原因在于锁记录存在于vnode上而vnode是内核数据fork只会复制用户地址空间的数据而且子进程的ID和父进程也不同所以子进程不会继承父进程的加的记录锁建议性锁和强制性锁当一个进程调用fcntl对文件加了记录锁后其他进程是可以直接调用read和write函数读写该文件的这时加的锁称为建议性锁。如果需要在调用read和write时检查读写区域是否加锁就需要加强制性锁。通过设置文件的“set-group-id”位并取消文件组执行位调用fcntl就加的是强制性锁了