fcntl记录锁

#include<fcntl.h>

int fcntl(fd,F_GETLK/F_SETLK/F_SETLKW,struct flock *flockptr);

F_GETLK:测试flockptr描述的锁,是否和现有锁冲突。冲突:现有锁写入flockptr中;不冲突:flockptr不变。

F_SETLK:试图获得读锁、写锁、解锁,冲突,立即出错返回,errno为EACCES/EAGAIN

F_SETLKW:F_SETLK阻塞版,不冲突,同F_SETLK;冲突,休眠,直到可以创建锁,或者信号中断唤醒。

同一个进程,同一个区域加锁不冲突,新创建的锁直接替换原来的锁。系统会按需求组合/分裂相邻区。可以在文件尾之后加锁,不可在文件头之前加锁。

struct flock {
    short l_type; /* Type of lock: F_RDLCK共享读锁, F_WRLCK独占写锁, F_UNLCK解锁 */
    short l_whence; /* How to interpret l_start: SEEK_SET, SEEK_CUR, SEEK_END */
    off_t l_start; /* Starting offset for lock */  同lseek函数,制定开始位置
    off_t l_len; /* Number of bytes to lock */    指定结束位置,0标识结束位置任意远
    pid_t l_pid; /* PID of process blocking our lock (F_GETLK only) */  F_GETLK测试时写入,其他时不可用
};

锁的隐含继承和释放:

1,锁与进程和文件关联:进程或文件结束,关联锁也释放

2,fork不会继承锁

3,exec继承锁,若设置了执行时关闭标志,exec后,文件描述符关闭,当然锁也释放了。

上一篇:【Xamarin挖墙脚系列:配置Mac之间的连接问题】


下一篇:bzoj1594