将晦涩难懂的技术讲的通俗易懂
分类: LINUX
2013-04-09 10:13:57
fcntl有强大的功能,它能够复制一个现有的描述符,获得/设置文件描述符标记,获得/设置文件状态标记,获得/设置异步I/O所有权,获得/设置纪录锁。
当多个用户共同使用,操作一个文件的情况,Linux通常采用的方法就是给文件上锁,来避免共享资源产生竞争的状态。
fcntl文件锁有两种类型:建议性锁和强制性锁
使用fcntl文件锁进行I/O操作必须小心:进程在开始任何I/O操作前如何去处理锁,在对文件解锁前如何完成所有的操作,是必须考虑的。如果在设置锁之前打开文件,或者读取该锁之后关闭文件,另一个进程就可能在上锁/解锁操作和打开/关闭操作之间的几分之一秒内访问该文件。当一个进程对文件加锁后,无论它是否释放所加的锁,只要文件关闭,内核都会自动释放加在文件上的建议性锁(这也是建议性锁和强制性锁的最大区别), 所以不要想设置建议性锁来达到永久不让别的进程访问文件的目的(强制性锁才可以)^_^;强制性锁则对所有进程起作用。
在Linux中实现上锁的函数有lock()和fcntl()。
要想让linux支持强制性锁,不但在mount的时候需要加上-o mand(APUE中文版有误,它写成了_omand), 而且对要加锁的文件也需要设置相关权限 (turn on set-group-ID and turn off group-execute)参见[4].
例子:
但是,如果同时,又有个流氓进程,管它3721,冲上去,open, write。
这时候那几个进程fcntl对这种方式无能为力,这样就叫不一致。文件最后的状态就不定了。
正因为这种锁约束不了其它的访问方式,所以叫建议行锁。强制性锁需要内核支持的,对read, write, open都会检查锁。
如何在Linux系统上使用强制性锁呢?