#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后,文件描述符关闭,当然锁也释放了。