当前位置:  技术问答>linux和unix

UNIX C 下flock()函数该怎么用啊。

    来源: 互联网  发布时间:2016-07-18

    本文导语:  在包含了头文件的情况下,编译时始终提示没有定义的flock。而且用man k flock 也找不到帮助文档。 | 有三种不同的文件锁,这三种都是“咨询性”的,也就是说它们依靠程序之间的 合作,所...

在包含了头文件的情况下,编译时始终提示没有定义的flock。而且用man k flock 也找不到帮助文档。

|
有三种不同的文件锁,这三种都是“咨询性”的,也就是说它们依靠程序之间的
合作,所以一个项目中的所有程序封锁政策的一致是非常重要的,当你的程序需
要和第三方软件共享文件时应该格外地小心。

有些程序利用诸如 FIlENAME.lock 的文件锁文件,然后简单地测试此类文件是否存在。
这种方法显然不太好,因为当产生文件的进程被杀后,锁文件依然存在,这样文件也许会被永久锁住。
UUCP中把产生文件的进程号PID存入文件,但这样做仍然不保险,因为PID的利用是回收型的。

这里是三个文件锁函数:
     flock();
     lockf();
     fcntl();

flock()是从BSD中衍生出来的,但目前在大多数UNIX系统上都能找到,在单个主
机上flock()简单有效,但它不能在NFS上工作。Perl中也有一个有点让人迷惑的
flock()函数,但却是在perl内部实现的。

fcntl()是唯一的符合POSIX标准的文件锁实现,所以也是唯一可移植的。它也同
时是最强大的文件锁--也是最难用的。在NFS文件系统上,fcntl()请求会被递
交给叫rpc.lockd的守护进程,然后由它负责和主机端的lockd对话,和flock()
不同,fcntl()可以实现记录层上的封锁。

lockf()只是一个简化了的fcntl()文件锁接口。

无论你使用哪一种文件锁,请一定记住在锁生效之前用sync来更新你所有的文件
输入/输出。

      lock(fd);
      write_to(some_function_of(fd));
      flush_output_to(fd); /* 在去锁之前一定要冲洗输出 */
      unlock(fd);
      do_something_else;   /* 也许另外一个进程会更新它 */
      lock(fd);
      seek(fd, somewhere); /* 因为原来的文件指针已不安全 */
      do_something_with(fd);      ...

一些有用的fcntl()封锁方法(为了简洁略去错误处理):


     #include ;
     #include ;
    
     read_lock(int fd)   /* 整个文件上的一个共享的文件锁 */
     {
         fcntl(fd, F_SETLKW, file_lock(F_RDLCK, SEEK_SET));
     }
    
     write_lock(int fd)  /* 整个文件上的一个排外文件锁 */
     {
         fcntl(fd, F_SETLKW, file_lock(F_WRLCK, SEEK_SET));
     }
    
     append_lock(int fd) /* 一个封锁文件结尾的锁,
                            其他进程可以访问现有内容 */
     {
         fcntl(fd, F_SETLKW, file_lock(F_WRLCK, SEEK_END));
     }
前面所用的file_lock函数如下:

      struct flock* file_lock(short type, short whence)
     {
         static struct flock ret ;
         ret.l_type = type ;
         ret.l_start = 0 ;
         ret.l_whence = whence ;
         ret.l_len = 0 ;
         ret.l_pid = getpid() ;
         return &ret ;
     }

另外,最好参考一下 《Unix环境高级编程》吧,里面有讲的很详细...

|
flock(锁定文件或解除锁定)  
相关函数  open,fcntl

表头文件  #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。

|
http://blog.csdn.net/ruixj/archive/2006/07/28/993357.aspx
参考上面

    
 
 

您可能感兴趣的文章:

  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • 谁有介绍UNIX下面函数的书啊,类似UNIX编程参考手册的东西
  • php将unix时间戳转换成字符串时间函数(date)
  • 哪位大侠有unix/linux的函数和函数所在的文件
  • UNIX C函数中是否有类似“ls”的函数调用?
  • Unix系统函数和C语言标准函数库有重叠的部分吗?
  • 初学Unix,问:标准级函数,如fopen,fclose;系统级函数open,close,两者什么关系?(在一篇讲文件操作的文章中看到的)
  • c语言也能重载函数? 怎么解释。unix编程的open函数。
  • UNIX中的函数库?高分相送!
  • SOS ,在UNIX下编译C++程序时出现链接错误:未下义的符号,但函数库里有这些函数,不知道为什么?
  • 急:unix的shell脚本中,定义了一个函数getDate(),在后面的执行命令参数用要使用这个函数的返回值,应该怎么写?
  • 在Unix下C语言中的SignalInit函数怎么用
  • 寻求UNIX下的C函数库
  • UNIX下有没有可以直接得到UUID的函数
  • unix下,g++ 报strcmpi函数,找不到
  • 请问在linux/unix下有没有象GetKeyboardState()一样对键盘状态进行控制的函数?
  • UNIX下函数
  • 请教UNIX C字符输入的检测函数?
  • 在unix中有没有ucs2编码与中文的转换函数???
  • 关于unix函数中括号中标识含义
  • 有没有操作unix风格配置文件的函数库?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util.regex类pattern的类成员方法: unix_lines定义及介绍
  • 刚刚接触Unix系统和Unix编程。急需Unix下多线程程序设计和网络Socket程序设计方面的资料。
  • unix/Linux下c++ boost thread库读写锁介绍
  • 关于UNIX的历史 : 1973年,K.Thompson和D.M.ritchie,用C改写UNIX。那么,在此之前,UNIX是用什么写的?
  • php将标准字符串格式时间转换成unix时间戳_strtotime
  • 没有unix系统我如何学习unix
  • unix盘哪里有下载的??哪里有比较好的unix论坛??万分感谢!!!!!!!!!
  • 急!装完unix5.06,再装win2000。重启后不能进unix.
  • UNIX特急!!!digital unix问题,请专家快来!!!
  • UNIX支持中文否,请推荐UNIX好书
  • SCO UNIX 5.0用软盘启动之后无法启动UNIX
  • 散分!!unix 用户调查!!!你使用哪款unix
  • hp unix 和 sco unix的区别
  • 入门问题,我想向UNIX编程方向发展,单目前不会UNIX,我该如何做
  • 强烈建议将linux/Unix栏目放到“软件开发者”大类里面来。----Unix开发的人助威支持!!!
  • 现在那些unix比较流行?Linux和 Unix有 什么区别?
  • 小问题, Unix 如何建立一个文件 ,unix 文件有后缀名吗
  • 我想学习Unix,请高手给个下载网址,用linux来学习Unix差别大吗?
  • 请问各位unix大虾,哪有免费的unix下载?
  • 学UNIX从SOC UNIX开始好吗?
  • 安装SCO UNIX到PC机上是否一定要用SCO UNIX光盘?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3