linux命令解锁文件 linux怎么解锁文件夹( 三 )


然而,区域锁定的创建和使用都比上面说的文件锁定复杂很多 。
1、创建区域锁定
在Linux上为实现这一功能,我们可以使用fcntl系统调用和lockf调用,但是下面以fcntl系统调用来讲解区域锁定的创建 。
fctnl的函数原理为:
int fctnl(int fildes, int command, ...);
它对一个打开的文件描述进行操作 , 并能根据command参数的设置完成不同的任务,它有三个可选的任务:F_GETLK,F_SETLK,F_SETLKW,至于这三个参数的意义下面再详述 。而当使用这些命令时,fcntl的第三个参数必须是一个指向flock结构的指针,所以在实际应用中,fctnl的函数原型一般为:int fctnl(int fildes, int command, struct flock *flock_st);
2、flock结构
准确来说 , flock结构依赖具体的实现,但是它至少包括下面的成员:
short l_type;文件锁的类型,对应于F_RDLCK(读锁,也叫共享锁),F_UNLCK(解锁,也叫清除锁),F_WRLCK(写锁,也叫独占锁)中的一个 。
short l_whence;从文件的哪个相对位置开始计算,对应于SEEK_SET(文件头),SEEK_CUR(当前位置),SEEK_END(文件尾)中的一个 。
off_t l_start;从l_whence开始的第l_start个字节开始计算 。
off_t l_len;锁定的区域的长度 。
pid_t l_pid;用来记录参持有锁的进程 。
成员l_whence、l_start和l_len定义了一个文件中的一个区域,即一个连续的字节集合,例如:
struct flock region;
region.l_whence = SEEK_SET;
region.l_start = 10;
region.l_len = 20;
则表示fcntl函数操作锁定的区域为文件头开始的第10到29个字节之间的这20个字节 。
3、文件锁的类型
从上面的flock的成员l_type的取值我们可以知道,文件锁的类型主要有三种,这里对他们进行详细的解说 。
F_RDLCK:
从它的名字我们就可以知道 , 它是一个读锁,也叫共享锁 。许多不同的进程可以拥有文件同一(或重叠)区域上的读(共享)锁 。而且只要任一进程拥有一把读(共享)锁 , 那么就没有进程可以再获得该区域上的写(独占)锁 。为了获得一把共享锁,文件必须以“读”或“读/写”方式打开 。
简单点来说就是 , 当一个进程在读文件中的数据时 , 文件中的数据不能被改变或改写,这是为了防止数据被改变而使读数据的程序读取到错乱的数据,而文件中的同一个区域能被多个进程同时读?。?这是容易理解的,因为读不会破坏数据,或者说读操作不会改变文件的数据 。
F_WRLCK:
从它的名字 , 我们就可以知道,它是一个写锁 , 也叫独占锁 。只有一个进程可以在文件中的任一特定区域拥有一把写(独占)锁 。一旦一个进程拥有了这样一把锁,任何其他进程都无法在该区域上获得任何类型的锁 。为了获得一把写(独占)锁,文件也必须以“读”或“读/写”方式打开 。
简单点来说,就是一个文件同一区域(或重叠)区域进在同一时间,只能有一个进程能对其进行写操作,并且在写操作进行期间,其他的进程不能对该区域进行读取数据 。这个要求是显然易见的,因为如果两个进程同时对一个文件进行写操作 , 就会使文件的内容错乱起来,而由于写时会改变文件中的数据,所以它也不允许其他进程对文件的数据进行读取和删除文件等操作 。
F_UNLCK:
从它的名字就可以知道 , 它用于把一个锁定的区域解锁 。
4、不同的command的意义
在前面说到fcntl函数的command参数时,说了三个命令选项,这里将对它们进行详细的解说 。
F_GETLK命令 , 它用于获取fildes(fcntl的第一个参数)打开的文件的锁信息,它不会尝试去锁定文件,调用进程可以把自己想创建的锁类型信息传递给fcntl,函数调用就会返回将会阻止获取锁的任何信息,即它可以测试你想创建的锁是否能成功被创建 。fcntl调用成功时 , 返回非-1,如果锁请求可以成功执行 , flock结构将保持不变,如果锁请求被阻止,fcntl会用相关的信息覆盖flock结构 。失败时返回-1 。

推荐阅读