linux 中的文件锁

Linux运行多个进程同时对一文件进行读写,虽然每一个read和write都是原子操作,但内核并没有在两个读写操作之间加以同步。因此,当一个进程多次调用read读文件时,就有可能在某两次读之间被另一进程所写,因此,读的的值将发生错误,造成了文件数据的随机性冲突,为解决此类并发进程对共享文件的访问控制问题,Linux设计了锁机制。

对文件加锁有两种:文件锁和记录锁。文件锁(文件锁定)用来锁定整个文件,记录锁(文件区锁定)用来锁定文件的某一区域,甚至是某一个字节。文件锁实现了不同进程对文件的共享与独占。

文件锁通过以原子操作的方式创建锁文件,确保该文件在同一时刻不会被其他程序创建。在进程打开文件时以O_RDWR | O_CREATE | O_EXCL模式,对整个文件进行加锁。

eg:  open(lock_file , O_RDWR | O_CREATE | O_EXCL, 0444)

记录锁通过fcntl函数,以struct flock实现对文件设定锁。fcntl亦用来对文件锁信息的查询。

eg: fcntl(int fildes, int command, struct flock *)

其中:command可以为:F_GETLK   F_SETLK   F_SETLKW

flock结构体:

struct flock{

short  l_type;  /锁类型

short  l_whence;//锁起始位置

off_t  l_start;//锁偏移地址

off_t  l_len;//区域长度

pid_t  l_pid;//持有锁的进程号

}

记录锁类型:共享锁F_RDLCK、独占锁F_WRLCK、解锁F_UNLCK(用来清除锁)

共享锁允许多个进程同时对文件进行都操作,亦称读锁

独占锁用来隔离文件内容,防止被其他进程所写,亦称互斥锁。

你可能感兴趣的:(c,linux)