首页 > 代码库 > linux C语言实现文件锁

linux C语言实现文件锁

flock函数说明

flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。

表头文件 #include<sys/file.h>
定义函数 int flock(int fd,int operation);
参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。

返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。

示例代码

test1.c:

#include <sys/file.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
	FILE *f = fopen("temp", "w+");
	if(!f)
	{
		printf("error file\n");
		return 0;
	}
	if(0 == flock(fileno(f), LOCK_EX))
	{
		printf("lock...\n");
		getchar();
		fclose(f);
		flock(fileno(f), LOCK_UN);
	}
	else
	{
		printf("lock failed\n");
	}
        return 0;
}

test2.c

#include <sys/stat.h>
#include <sys/types.h>
#include <sys/file.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>

int main()
{
   FILE *fp;
   char text[]="this is a test!";

   if((fp = fopen("temp", "w+")) == 0)
      printf("can‘t open file!\n");
   else
   {
      printf("open file success!\n");
	  int  i = flock(fileno(fp), LOCK_SH | LOCK_NB); // 加锁以判断文件是否已经被加锁了
	  printf("%d\n", i);
	  flock(fileno(fp), LOCK_UN);
		
      fwrite(text, strlen(text), 1, fp);
   }

   fclose(fp);
   return 0;
}
测试如下:

在终端1中,运行test1

在终端2中,运行test2

这里主要说明的是在test2.c中,对文件的操作也是要利用加锁来判断文件是否已经被加锁了,

int  i = flock(fileno(fp), LOCK_SH | LOCK_NB);
上面这行代码就是实现这个功能, 注意第二个参数,如果没有LOCK_NB的话,若文件已加锁则会进程阻塞,而上面的方式则不会出现这种问题;另外第一个参数,切勿直接传入(int)fp

i == 0 表示文件加锁成功, i == -1 表示文件已被加锁,不建议执行后续操作

小结:

flock函数的加锁是需要配合使用的,在文件操作之前,首先利用加锁成功与否来判定文件是否被加锁,若成功再进行后续的代码;否则表示文件被锁

linux C语言实现文件锁