前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux C语言实现文件锁

linux C语言实现文件锁

作者头像
一灰灰blog
发布2018-02-06 11:59:44
8.3K0
发布2018-02-06 11:59:44
举报
文章被收录于专栏:小灰灰小灰灰

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:

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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中,对文件的操作也是要利用加锁来判断文件是否已经被加锁了,

代码语言:javascript
复制
int  i = flock(fileno(fp), LOCK_SH | LOCK_NB);

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

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

小结:

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • flock函数说明
  • 示例代码
  • 小结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档