在文已经共享的状况下如何操做,也就是当多个进程同时操做同一个文件时,咱们怎么保证文件数据的正确性。linux一般采用的方法是文件上锁,来避免共享资源的产生竞争状态。linux
文件锁包括建议性锁和强制性的锁。建议性的,顾名思义,相对温柔一些,在对文件进行锁操做时,会检测是否已经有锁存在,而且尊重已有的锁。在通常的状况下,内核和系统都不使用建议锁。强制性的锁是由内核执行的锁,当一个文件被上锁进行写入操做的时候,内核将阻止其余进程对其进行读写操做。采起强制性的锁对性能的影响很大,每次进行读写操做都必须检查是否有锁存在。函数
在linux中对文件进行锁操做,能够使用lockf()和fcntl()这两个函数,前者对文件施加建议性锁,后者为两种锁都行。另外fcntl还能够对文件的某一记录上锁。性能
fcntl使用格式为:进程
int fcntl(int fd,int cmd,struct flock *lock);资源
fd为文件描述符,cmd为一些命令参数,flcok结构体用来设置记录锁的具体状态。cmd
fcntl() 对已打开的文件描述符进行操做,并根据命令参数的不一样可以执行不一样的任务。关于文件锁的几个命令选项以下:
方法
F_UNLCK : 解除锁定im
l_start 为相对位移量数据
l_whence 必须是如下几个值之一( 在 unistd.h 中定义):
SEEK_SET : 文件开始位置
SEEK_CUR: 文件当前位置
SEEK_END: 文件末尾位置img
l_len 加锁的长度
l_pid当前文件操做的进程id号
下面是简单的例子
运行结果:
读是能够共享的。
写的例子:
运行结果:
同时写的话,发生竞争,后者不能对文件作写操做,只有当当前的锁解开,后续的才可写文件