linxu c语言 fcntl函数和flock函数区别说明
flock和fcntl都有的功能,但他们还有一点小小的区别:
1.flock只能加全局fcntl可以加全局也可以加局部
2.当一个程用flock一个文件加锁时,用另一个程再给这个文件加,它会阻塞或者也可以返回加(可以自己置)
3.当一个程用fcntl一个文件加锁时,用另一个程去或写文件取加的信息,然后在给这个文件加
3.一个文件加fcntl的独占后,再给这个文件加flock的独占,其会入阻塞状
4.一个文件加flock的独占后,用fcntl信息取不到,再用write的返回值fcntl仍然可以文件加
/*******************************************************************/
 
linux下C语言中的flock函数用法 .
  文件  #include<sys/file.h>
  定函数  int flock(int fd,int operation);
  函数  flock()会依参数operation所指定的方式参数fd所指的文件做各种定或解除定的作。此函数只能定整个文件,无法定文件的某一区域
  参数  operation有下列四种情况:
  LOCK_SH 建立共享定。多个程可同时对同一个文件作共享
  LOCK_EX 建立互斥定。一个文件同只有一个互斥
  LOCK_UN 解除文件定状
  LOCK_NB 无法建立,此操作可不被阻断,上返回程。通常与LOCK_SHLO
CK_EX OR(|)
  一文件无法同建立共享定和互斥定,而当使用dup()fork()文件描述不会承此种
  返回  返回0表示成功,若有错误则返回-1错误存于errno。
 
flock只要在打开文件后,需要文件写之前flock一下就可以了,用完之后再flock一下,前面加,后面解。其简单,但是前段时间用的发现问题问题描述如下
一个程去打开文件,入一个整数,然后上一把写LOCK_EX),再入一个整数将解LOCK_UN),另一个程打开同一个文件,直接向文件中写数据,发现锁不起作用,能正常写入(我此用的是超)。google了一大圈发现flock不提供锁检查,也就是在用flock之前需要用自己去检查一下是否已上了明白点就是写文件之前用一下flock检查一下文件有没有上,如果上flock将会阻塞在那里(An attem
pt 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 ).
/**********************************************************/
 
linxu c语言 fcntl函数说明
功能描述:根据文件描述来操作文件的特性。 
文件控制函数
        fcntl -- file control


文件:
        #include <fcntl.h>; 
        int fcntl(int fd, int cmd); 
        int fcntl(int fd, int cmd, long arg); 
        int fcntl(int fd, int cmd, struct flock *lock); 

[描述]
            Fcntl()针对(文件)描述符提供控制.参数fd是被参数cmd操作(如下面的描述)的描述符.
            针对cmd,fcntl能够接受第三个参数int arg
fcntl函数有5种功能: 
1.复制一个有的描述符(cmd=F_DUPFD
2.得/置文件描述符标记(cmd=F_GETFDF_SETFD). 
3.得/置文件状态标记(cmd=F_GETFLF_SETFL). 
4.得/置异步I/O所有权(cmd=F_GETOWNF_SETOWN). 
5.得/记录锁(cmd=F_GETLK,F_SETLKF_SETLKW).
    cmd 
            F_DUPFD            返回一个如下描述的(文件)描述符:
                            o            最小的大于或等于arg的一个可用的描述符
                            o            与原始操作符一的某象的引用
                            o            如果象是文件(file),返回一个新的描述符,个描述符与arg共享相同的偏移量(offset)
                            o            相同的访问模式(,写或/)
                            o            相同的文件状态标(:两个文件描述符共享相同的状态标)
                            o            与新的文件描述符合在一起的close-on-exec志被置成交叉式访问execve(2)的系统调
     
   
            F_GETFD            取得与文件描述符fdclose-on-exec,类似FD_CLOEXEC.如果返回FD_CLOEXEC行与运算果是0,文件保持交叉式访问exec(),如果通exec运行的,文件将被关(arg被忽略)
     
   
            F_SETFD            close-on-exec以参数argFD_CLOEXEC位决定。     
   
            F_GETFL            取得fd的文件状态标,如同下面的描述一(arg被忽略)
     
   
            F_SETFL            arg描述符状态标,可以更改的几个志是: O_APPENDO_NONBLOCKO_SYNCO_ASYNC

     
     
            F_GETOWN             取得当前正在接收SIGIO或者SIGURG信号的idid,id返回成负值(arg被忽略)
     
   
            F_SETOWN            置将接收SIGIOSIGURG信号的idid,id提供负值arg,,arg将被认为id

   
            命令字(cmd)F_GETFLF_SETFL志如下面的描述:
            O_NONBLOCK            非阻塞I/O;如果read(2)用没有可取的数据,或者如果write(2)操作将阻塞,readwrite用返回-1EAGAIN错误
            O_APPEND                    强制每次写(write)操作都添加在文件大的末尾,相当于open(2)O_APPEND
            O_DIRECT                    最小化或去掉readingwriting存影响.将企避免存你的或写的数据.如果不能够避免,那么它将最小化已存了的数据造成的影响.如果志用的不够好,将大大的降低性能
            O_ASYNC                    I/O可用的,SIGIO信号送到,例如:当有数据可以
在修改文件描述符志或文件状态标须谨慎,先要取得在的,然后按照希望修改它,最后置新。不能只是F_SETFDF_SETFL命令,这样会关以前置的志位。
fcntl的返回 与命令有关。如果出,所有命令都返回-1,如果成功返回某个其他。下列三个命令有特定返回F_DUPFD,F_GETFD,F_GETFL以及F_GETOWN。第一个返回新
的文件描述符,第二个返回相应标志,最后一个返回一个正的IDID
控制fd的例程 

/**三个存取方式(O_RDONLY,O_WRONLY,以及O_RDWR)并不各占1位。(三种志的各是012,由于史原因。三种互斥一个文件只能有三种之一。)因此首先必用屏蔽字O_ACCMODE取得存取方式位,然后将果与三种相比
****/


switch(var & O_ACCMODE) 

case O_RDONLY : cout<<"Read only.."<
.得/记录锁的功能: (cmd=F_GETLK,F_SETLKF_SETLKW).
          F_GETLK          第三个参数arg(一个指向flock构体)取得第一个阻塞lock description指向的的.取得的信息将覆盖fcntl()flock构的信息.如果没有发现能够阻止本次(flock)生成的,构将不被改,除非的类型被置成F_UNLCK.

     
          F_SETLK          按照指向构体flock的指的第三个参数arg所描述的的信息置或者清除一个文件segment.F_SETLK被用来实现共享() (F_RDLCK)或独占()(F_WRLCK),可以去掉两种(F_UNLCK).如果共享或独占不能被,fcntl()将立即返回EAGAIN.


     
          F_SETLKW          除了共享或独占被其他的阻塞种情况外,个命令和F_SETLK是一.如果共享或独占被其他的阻塞,程将等待直到求能够完成.fcntl()正在等待文件的某个区域的候捕捉到一个信号,如果个信号没有被指定SA_RESTART,fcntl将被中断.

     
          当一个共享set到一个文件的某段的,其他的程可以set共享个段或个段的一部分.共享所阻止任何其他set独占段保区域的任何部分.如果文件描述符没有以访问方式打开的,共享求会失

   
          独占阻止任何其他的程在段保区域任何位置置共享或独占.如果文件描述符不是以写的访问方式打开的,独占求会失
构体flock的指 
struct flcok 

short int l_type; /* 定的状*/
//三个参数用于分段文件加,若整个文件加l_whence=SEEK_SET,l_start=0,l_len=0;
short int l_whence;/*决定l_start位置*/ 
off_t l_start; /*定区域的开位置*/ 
off_t l_len; /*定区域的大小*/

pid_t l_pid; /*作的*/ 
};

l_type 有三种状
F_RDLCK 建立一个供取用的 
F_WRLCK 建立一个供写入用的 
F_UNLCK 除之前建立的

l_whence 也有三种方式
SEEK_SET 以文件开头为锁定的起始位置。 
SEEK_CUR 以目前文件写位置为锁定的起始位置 
SEEK_END 以文件为锁定的起始位置。 
 
文件部分的相关明及使用方法:
当写文件的候首先的文件加:
1.flock构体
2.指定cmd  F_SETLK 
3.写数据
4.指定cmdF_SETLKW 
 
当有其他线程写同一文件的候: 
1.判断文件是否已被加指定cmdF_GETLKflock构体,flock.l_type; /* 定的状*/
2.判断是否加,加就提示,没加锁继续....
2.指定cmd  F_SETLK 
3.写数据
4.指定cmdF_SETLKW 
/***************************************************************/
lockf() 使用方
        #include <unistdh.>
        int lockf(fd,cmd,size)
        int fd,cmd;
        long size;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。