C/C++ flock函数(Linux)文件锁

  • 头文件:<sys/file.h>

  • 定义:int flock(int fd, int operation);

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

  • 参数说明:
    - LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
    - LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁。
    - LOCK_UN 解除文件锁定状态。
    - LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。

     单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
    
  • 返回值:返回0表示成功,若有错误则返回-1,错误代码存于errno。
    - void perror(const char *s):将上一个函数发生错误的原因输出到标准错误(stderr),参数s 所指的字符串会先打印出,后面再加上错误原因 字符串。此错误原因依照全局变量 errno 的值来决定要输出的字符串。
    - char *strerror(int errno):将错误代码转换为字符串错误信息。
    - extern int errno;(#include <errno.h>)可以获取errno。errno被设为以下的某个值:

    • EACCES:访问出错
    • EAGAIN:文件已被锁定,或者太多的内存已被锁定
    • EBADF:fd不是有效的文件描述词
    • EINVAL:一个或者多个参数无效
    • ENFILE:已达到系统对打开文件的限制
    • ENODEV:指定文件所在的文件系统不支持内存映射
    • ENOMEM:内存不足,或者进程已超出最大内存映射数量
    • EPERM:权能不足,操作不允许
    • ETXTBSY:已写的方式打开文件,同时指定MAP_DENYWRITE标志
    • SIGSEGV:试着向只读区写入
    • SIGBUS:试着访问不属于进程的内存区
  • 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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值