专栏首页小灰灰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函数的加锁是需要配合使用的,在文件操作之前,首先利用加锁成功与否来判定文件是否被加锁,若成功再进行后续的代码;否则表示文件被锁

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java可以如何实现文件变动的监听

    应用中使用logback作为日志输出组件的话,大部分会去配置 logback.xml 这个文件,而且生产环境下,直接去修改logback.xml文件中的日志级别...

    一灰灰blog
  • Java可以如何实现文件变动的监听

    Java可以如何实现文件变动的监听 应用中使用logback作为日志输出组件的话,大部分会去配置 logback.xml 这个文件,而且生产环境下,直接去修改l...

    一灰灰blog
  • 【SpringBoot WebFlux 系列】 header 参数解析

    上一篇 weblfux 主要介绍了 path 参数的解析与映射关系,在我们进入 url 参数/post 表单之前,先看一下另外的一种参数--请求头中的参数如何处...

    一灰灰blog
  • 计算机英语

    Deprecated Interfaces:过时的接口 reactor:n. [化工] 反应器; [核] 反应堆; 起反应的人; 原子炉; Decouple...

    城市中的游牧民族
  • vs使用指南

    1、卸载可以临时解除项目与解决方案生成的关联;移除可以解除项与解决方案、项目或文件夹的关联但 不移除其物理文件,移除没有卸载那么彻底,但他们都不会移除物理文件,...

    静心物语313
  • Linux中stat函数和stat命令使用详解

    linux文件里的【inode = index node】解释:要理解inode必须了解磁盘和【目录项】,inode实际是连接【目录项】和磁盘的中间物质。

    砸漏
  • 聊聊eureka instance的lastDirtyTimestamp

    本文主要研究一下eureka instance的lastDirtyTimestamp

    codecraft
  • AI 安防,地产巨头的「自我革命」

    公开资料显示,梁琪庚于1998年加入万科,历任武汉万科物业总经理、苏南万科物业总经理。

    AI掘金志
  • WXAPKG 解包后如何提取页面逻辑?

    前天小程序分发下载执行包,我也下载了一些,用来学习。 按照我的规划,这部分的内容整体会分为4~5次推送完成,首先是配置的提取和页面逻辑的提取,这部分会比较快,很...

    企鹅号小编
  • 磁盘文件读性能测试

     Timing buffered disk reads: 2454 MB in  3.00 seconds = 817.84 MB/sec

    一见

扫码关注云+社区

领取腾讯云代金券