表头文件  #include

定义函数  int flock(int fd,int operation);

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

參数  operation有下列四种情况:

LOCK_SH 建立共享锁定。多个进程可同一时候对同一个文件作共享锁定。

LOCK_EX 建立相互排斥锁定。一个文件同一时候仅仅有一个相互排斥锁定。

LOCK_UN 解除文件锁定状态。

LOCK_NB 无法建立锁定时,此操作可不被阻断,立即返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。

单一文件无法同一时候建立共享锁定和相互排斥锁定,而当使用dup()或fork()时文件描写叙述词不会继承此种锁定。

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

flock仅仅要在打开文件后,须要对文件读写之前flock一下就能够了,用完之后再flock一下,前面加锁,后面解锁。事实上确实是这么简单,可是前段时间用的时候发现点问题,问题描写叙述例如以下:

一个进程去打开文件,输入一个整数,然后上一把写锁(LOCK_EX),再输入一个整数将解锁(LOCK_UN),还有一个进程打开相同一个文件,直接向文件里写数据,发现锁不起作用,能正常写入(我此时用的是超级用户)。google了一大圈发现flock不提供锁检查,也就是说在用flock之前须要用户自己去检查一下是否已经上了锁,说明确点就是读写文件之前用一下flock检查一下文件有没有上锁,假设上锁了flock将会堵塞在那里(An attempt to lock

the file using one of these file descriptors may be denied by a lock that the calling process has already placed via another descriptor ),除非用了LOCK_NB。一个完整的用于測试的事例代码例如以下所看到的:

//lockfile.c

#include

#include

#include

#include

#include

#include

int main()

{

int fd,i;

char path[]="/home/taoyong/test.txt";

extern int errno;

fd=open(path,O_WRONLY|O_CREAT);

if(fd!=-1)

{

printf("open file %s ./n",path);

printf("please input a number to lock the file./n");

scanf("%d",&i);

if(flock(fd,LOCK_EX)==0)

{

printf("the file was locked./n");

}

else

{

printf("the file was not locked./n");

}

printf("please input a number to unlock the file./n");

scanf("%d",&i);

if(flock(fd,LOCK_UN)==0)

{

printf("the file was unlocked./n");

}

else

{

printf("the file was not unlocked./n");

}

close(fd);

}

else

{

printf("cannot open file %s/n",path);

printf("errno:%d/n",errno);

printf("errMsg:%s",strerror(errno));

}

}

//testprocess.c

#include

#include

#include

#include

#include

#include

#include

int main()

{

int fd,i;

char path[]="/home/taoyong/test.txt";

char s[]="writing.../nwriting....../n";

extern int errno;

fd=open(path,O_WRONLY|O_CREAT|O_APPEND);

if(fd!=-1)

{

printf("open file %s ./n",path);

if(flock(fd,LOCK_EX|LOCK_NB)==0)

{

printf("the file was locked by the process./n");

if(-1!=write(fd,s,sizeof(s)))

{

printf("write %s to the file %s/n",s,path);

}

else

{

printf("cannot write the file %s/n",path);

printf("errno:%d/n",errno);

printf("errMsg:%s/n",strerror(errno));

}

}

else

{

printf("the file was locked by other process.Can't write.../n");

printf("errno:%d:",errno);

}

close(fd);

}

else

{

printf("cannot open file %s/n",path);

printf("errno:%d/n",errno);

printf("errMsg:%s",strerror(errno));

}

}

flock用法详解 linux_linux下一个C语言flock功能使用 .相关推荐

  1. flock用法详解 linux_linux下C语言中的flock函数使用方法 .

    表头文件  #include 定义函数  int flock(int fd,int operation); 函数说明  flock()会依參数operation所指定的方式对參数fd所指的文件做各种锁 ...

  2. flock用法详解 linux_netstat命令详解

    它主要的用法和详解! (netstat -na 命令),本文主要是说Linux下的netstat工具,然后详细说明一下各种网络连接状态. netstat -nat |awk '{print $6}'| ...

  3. java标签用法详解_介绍一个javaWeb自定义标签的用法详解

    这篇文章主要介绍了javaWeb自定义标签用法,结合实例形式分析了javaweb自定义标签的功能.定义方法及执行原理,需要的朋友可以参考下 本文实例讲述了javaWeb自定义标签用法.分享给大家供大家 ...

  4. linux中which命令详解,Linux下which命令使用详解(转)

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. locate 配合数据库查看文件位置. f ...

  5. ES6 — Promise基础用法详解(resolve、reject、then、catch,all,)

    ES6 - Promise基础用法详解 Promise 是一个构造函数,它自身拥有all.reject.resolve这几个眼熟的方法, 原型上有then.catch等同样熟悉的方法. 所以,在开始一 ...

  6. linux中用less命令,Linux less 命令用法详解

    原标题:Linux less 命令用法详解 less 是一个Linux命令行实用程序,用于显示文件或命令输出的内容,它一次只显示一个页面.它类似于 more ,但具有更高级的功能,允许您在文件中向前和 ...

  7. c语言for表达式1的作用,C语言for语句用法详解

    C语言for语句用法详解 C语言是一门高级计算机编程语言,设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.下面小编给大家介绍C语言f ...

  8. Linux下的awk用法详解

    Linux下的awk用法详解 一.awk介绍 二.awk的语法 三.awk常见用法 四.awk其他用法 五.awk语言特性 一.awk介绍 1.AWK 是一种处理文本文件的语言,是一个强大的文本分析工 ...

  9. linux为什么用tar压缩,linux下tar压缩和解压命令用法详解

    linux下tar压缩和解压命令用法详解 2017-03-25 14:06 分享人:老牛 将/usr/local/test目录下所有文件仅打包,不压缩到 /usr/local/auto_bak/目下 ...

最新文章

  1. 实现一个spring webservice服务端二:创建一个可以访问的webservice
  2. java B2B2C springmvc mybatis多租户电子商城系统(三):服务提供与调用
  3. jsp: jstl标签库 uri标签
  4. hadoop官方文档_hadoop体系简介
  5. mysql case break_按月转移日志表中日志时,mysql总是报‘MySQL server has gone away’这样的错!...
  6. JAVA——改变观感
  7. VTK:PolyData之ExtractSelectedIds
  8. 数字图像处理之点运算
  9. Notepad++远程连接Linux系统
  10. Halcon学习笔记(一):Qt+Halcon联合开发配置
  11. win10 iot core java_Windows 10 IoT Core 正式版初体验
  12. Web前端期末大作业--重工机械设备检测生产企业官网网页设计(HTML+CSS+JavaScript )实现
  13. Linux上的.NET框架Mono 2.0发布
  14. 计算机审计操作实验目的,计算机审计实验报告 满分原创!!.docx
  15. JQueryEasyUI学习笔记(一)
  16. iphone免越狱!使用filza修改设备型号!支持最高ios14.3
  17. OPNET 学习系列(一)
  18. Linux查看文件数量
  19. 学习计算机基本知识,怎样按序学习计算机基本知识
  20. 数据库查询的降序排列

热门文章

  1. 32位汇编寄存器含义解释
  2. android studio的 gradle 依赖同步错误解决方法
  3. 【ASP.NET Core】处理异常(下篇)
  4. get、post请求参数乱码解决方法(qq:1324981084)
  5. 死锁与活锁的原因 与解决方法(附加“饿死”)
  6. 腾讯QQ看点信息流推荐业务:内容分发场景的多目标架构实践
  7. 【干货】2020十大消费新机遇.pdf(附下载链接)
  8. 【报告分享】巨量算数:疫情期间汽车专题研究洞察.pdf(附下载链接)
  9. DeepWalk: Online Learning of Social Representations-2
  10. 集成学习框架-学习小结20161121