linux锁定用什么命令 linux锁定用户密码( 四 )


为了解决类似的问题 , 就出现了文件锁定 , 简单点来说,这是文件的一种安全的更新方式,当一个程序正在对文件进行写操作时,文件就会进入一种暂时状态 , 在这个状态下,如果另一个程序尝试读这个文件,它就会自动停下来等待这个状态结束 。Linux系统提供了很多特性来实现文件锁定,其中最简单的方法就是以原子操作的方式创建锁文件 。
用回之前的例子就是,文件锁就是当文件在写的时候,阻止其他的需要写或者要读文件的进程来操作这个文件 。
二、创建锁文件
创建一个锁文件是非常简单的 , 我们可以使用open系统调用来创建一个锁文件 , 在调用open时oflags参数要增加参数O_CREAT和O_EXCL标志,如file_desc = open("/tmp/LCK.test", O_RDWR|O_CREAT|O_EXCL, 0444);就可以创建一个锁文件/tmp/LCK.test 。O_CREAT|O_EXCL,可以确保调用者可以创建出文件,使用这个模式可以防止两个程序同时创建同一个文件,如果文件(/tmp/LCK.test)已经存在 , 则open调用就会失败,返回-1 。
如果一个程序在它执行时,只需要独占某个资源一段很短的时间,这个时间段(或代码区)通常被叫做临界区,我们需要在进入临界区之前使用open系统调用创建锁文件,然后在退出临界区时用unlink系统调用删除这个锁文件 。
注意:锁文件只是充当一个指示器的角色 , 程序间需要通过相互协作来使用它们,也就是说锁文件只是建议锁 , 而不是强制锁 , 并不会真正阻止你读写文件中的数据 。
可以看看下面的例子:源文件文件名为filelock1.c,代码如下:
#include unistd.h #include stdlib.h #include stdio.h #include fcntl.h #include errno.h int main() { const char *lock_file = "/tmp/LCK.test1"; int n_fd = -1; int n_tries = 10; while(n_tries--) { //创建锁文件 n_fd = open(lock_file, O_RDWR|O_CREAT|O_EXCL, 0444); if(n_fd == -1) { //创建失败 printf("%d - Lock already present ", getpid()); sleep(2); } else { //创建成功 printf("%d - I have exclusive access ", getpid()); sleep(1); close(n_fd); //删除锁文件,释放锁 unlink(lock_file); sleep(2); } } return 0; }
同时运行同一个程序的两个实例,运行结果为:
?
从运行的结果可以看出两个程序交叉地对对文件进行锁定 , 但是真实的操作却是 , 每次调用open函数去检查/tmp/LCK.test1这个文件是否存在,如果存在open调用就失败 , 显示有进程已经把这个文件锁定了,如果这个文件不存在,就创建这个文件,并显示许可信息 。但是这种做法有一定的缺憾,我们可以看到文件/tmp/LCK.test1被创建了很多次,也被unlink删除了很多次,也就是说我们不能使用已经事先有数据的文件作为这种锁文件,因为如果文件已经存在,则open调用总是失败 。
给我的感觉是 , 这更像是一种对进程工作的协调性安排,更像是二进制信号量的作用,文件存在为0,不存在为1,而不是真正的文件锁定 。
三、区域锁定
我们还有一个问题,就是如果同一个文件有多个进程需要对它进行读写 , 而一个文件同一时间只能被一个进程进行写操作,但是多个进程读写的区域互不相关,如果总是要等一个进程写完其他的进程才能对其进行读写,效率又太低,那么是否可以让多个进程同时对文件进行读写以提高数据读写的效率呢?
为了解决上面提到的问题 , 和出现在第二点中的问题 , 即不能把文件锁定到指定的已存在的数据文件上的问题,我们提出了一种新的解决方案,就是区域锁定 。
简单点来说,区域锁定就是 , 文件中的某个部分被锁定了,但其他程序可以访问这个文件中的其他部分 。

推荐阅读