表头文件  #include<sys/file.h>

  定义函数  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。一个完整的用于测试的事例代码如下所示:

  1. //lockfile.c
  2.  
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <errno.h>
  9.  
  10. int main()
  11. {
  12. int fd,i;
  13. char path[]="/home/taoyong/test.txt";
  14. extern int errno;
  15. fd=open(path,O_WRONLY|O_CREAT);
  16.  
  17. if(fd!=-1)
  18. {
  19. printf("open file %s ./n",path);
  20. printf("please input a number to lock the file./n");
  21. scanf("%d",&i);
  22.  
  23. if(flock(fd,LOCK_EX)==0)
  24. {
  25. printf("the file was locked./n");
  26. }
  27. else
  28. {
  29. printf("the file was not locked./n");
  30. }
  31. printf("please input a number to unlock the file./n");
  32.  
  33. scanf("%d",&i);
  34.  
  35. if(flock(fd,LOCK_UN)==0)
  36. {
  37. printf("the file was unlocked./n");
  38. }
  39. else
  40. {
  41. printf("the file was not unlocked./n");
  42. }
  43. close(fd);
  44.  
  45. }
  46. else
  47. {
  48. printf("cannot open file %s/n",path);
  49. printf("errno:%d/n",errno);
  50. printf("errMsg:%s",strerror(errno));
  51. }
  52. }
  53.  
  54. //testprocess.c
  55.  
  56. #include <stdio.h>
  57. #include <unistd.h>
  58. #include <sys/types.h>
  59. #include <sys/stat.h>
  60. #include <fcntl.h>
  61. #include <errno.h>
  62. #include <sys/file.h>
  63.  
  64. int main()
  65. {
  66. int fd,i;
  67. char path[]="/home/taoyong/test.txt";
  68. char s[]="writing.../nwriting....../n";
  69. extern int errno;
  70. fd=open(path,O_WRONLY|O_CREAT|O_APPEND);
  71. if(fd!=-1)
  72. {
  73. printf("open file %s ./n",path);
  74.  
  75. if(flock(fd,LOCK_EX|LOCK_NB)==0)
  76. {
  77. printf("the file was locked by the process./n");
  78.  
  79. if(-1!=write(fd,s,sizeof(s)))
  80. {
  81. printf("write %s to the file %s/n",s,path);
  82. }
  83. else
  84. {
  85. printf("cannot write the file %s/n",path);
  86. printf("errno:%d/n",errno);
  87. printf("errMsg:%s/n",strerror(errno));
  88. }
  89.  
  90. }
  91. else
  92. {
  93. printf("the file was locked by other process.Can't write.../n");
  94. printf("errno:%d:",errno);
  95. }
  96.  
  97. close(fd);
  98.  
  99. }
  100. else
  101. {
  102. printf("cannot open file %s/n",path);
  103. printf("errno:%d/n",errno);
  104. printf("errMsg:%s",strerror(errno));
  105. }
  106. }

linux下C语言中的flock函数用法 【转】的更多相关文章

  1. linux下C语言中的flock函数使用方法 .

    表头文件  #include<sys/file.h> 定义函数  int flock(int fd,int operation); 函数说明  flock()会依參数operation所指 ...

  2. c语言中的rand()函数用法

    rand() rand()函数作用:用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的. rand()函数返回:返回一个范围在 ...

  3. c语言中的rewind函数,Win CE 不支持,可用fseek函数替换

    FILE *read = fopen(cXmlFile,"rb"); if (read) { fseek(read, 0L, SEEK_END); int len = ftell( ...

  4. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  5. Linux下编译C代码,出现tan函数报错的情况

    undefined reference to `tan' 但是已经包含了头文件 <math.h>了,可还是报错,说是找不到tan 这个问题的原因不是很清楚, 但是网上给出的方案,就是编译的 ...

  6. c++ 网络编程(五) LINUX下 socket编程 多种I/O函数 -以及readv和writev函数用法

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9614056.html 一.多种I/O函数 前言:之前我们讲的数据传输一般Linux上用writ ...

  7. linux下信号量可设值的函数操作

    #include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <errno.h ...

  8. c语言中的malloc函数

    少壮不努力,大一的时候c语言学得不扎实,最近学数据结构的时候看到c语言中malloc函数都不知道了,这里记录一下,避免以后再忘. malloc的全称是memory allocation,中文叫动态内存 ...

  9. C语言中static关键字的用法

    C记得还是大一时学的,现在觉得好久没用了,又捧起来看看.今天刚看到有关static关键字,仔细地看了一遍<C和指针>这本书中的解释,现在觉得清楚多了. 首先,我们将static关键字,修饰 ...

随机推荐

  1. 怎样打造一个分布式数据库——rocksDB, raft, mvcc,本质上是为了解决跨数据中心的复制

    摘自:http://www.infoq.com/cn/articles/how-to-build-a-distributed-database?utm_campaign=rightbar_v2& ...

  2. mysql的部分命令图解

    1.查询有哪些库: show databases;  图中除了Carlton库之外,其它都是系统自带的. 要养成在命令后加入:的习惯 2.查看某个库的表 show tables; 3. 查看表的字段 ...

  3. 知名杀毒软件Mcafee(麦咖啡)个人版 资源汇总兼科普(来自卡饭)

    虽然早已不是用咖啡了,但我也实时关注的咖啡的一举一动,潜水看帖日久,发现小白众多,好多有价值的帖子淹没于帖海当中,甚是惋惜.     我有如下建议      1.咖啡区管理层,能否吧一些优秀的资源教程 ...

  4. 其他窗体赋值给comboBox实现值的回显,并使赋的值处于选中状态(根据text获取selectedindex)

    Form1 发货单位的这个下拉框comboBox1已经绑定数据库test表的name字段,里面有很多单位名称 比如有:甲公司.乙公司... 1.Form1的comboBox1首先绑定数据库的数据表te ...

  5. 理解ROS rqt_console和 roslaunch

    1.使用rqt_console和roslaunch 这篇教程将介绍使用rqt_console和rqt_logger_level来调试以及使用roslaunch一次启动许多nodes.如果你使用ROS  ...

  6. LCD驱动 15-3

    测试:1:make menuconfig去掉原来的驱动程序    Device Drivers  --->             Graphics support  --->      ...

  7. windbg调试C#代码(一)

    用windbg调试C#代码是比较麻烦的,因为windbg是针对OS层级的,而C#被CLR隔了一层,很多原生的命令如查看局部变量dv.查看变量类型dt等在CLR的环境中都不能用了.必须使用针对CLR的扩 ...

  8. WebBrowers & HtmlViewers collection

    WebBrowers & HtmlViewers collection 浏览: 加入我的收藏 楼主: THtmlViewerhttps://github.com/BerndGabriel/Ht ...

  9. web安全测试-AppScan

    安全测试应该是测试中非常重要的一部分,但他常常最容易被忽视掉. 尽管国内经常出现各种安全事件,但没有真正的引起人们的注意.不管是开发还是测试都不太关注产品的安全.当然,这也不能怪我们苦B的“民工兄弟” ...

  10. Cygwin下载,安装教程

    Cygwin是一个用于在Windows上模拟Linux环境的软件,由于工作上的需要,我要使用它,至于为什么用它,我在这里不做过多的解释,本文的目的,旨在于解决Cygwin安装上的问题. 原始的安装Cy ...