#include <fcntl.h> int fcntl(int fd, int cmd, …/* struct flock *flockptr */); |
---|
对于记录锁,cmd是F_GETLK、F_SETLK或F_SETLKW。第三个参数是一个指向flock结构的指针。
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 * /
off_t l_len; / * Number of bytes to lock * /
pid_t l_pid; / * PID of process blocking our lock(set by F_GETLK and F_OFD_GETLK) * /
};
对flock结构说明如下。
● 所希望的锁类型:F_RDLCK(共享读锁)、F_WRLCK(独占性写锁)或F_UNLCK(解锁一个区域)。
● 要加锁或解锁的区域的其实字节偏移量(l_start和l_whence)。
● 区域的字节长度(l_len)。
● 进程ID(l_pid)持有的锁能阻塞当前进程(仅由F_GETLK返回)。
锁的隐含继承和释放
关于记录锁的自动继承和释放有3条规则。
(1)锁与进程和文件两者相关联。当一个进程终止时,它所建立的锁全部释放;无论一个文件描述符何时关闭,该进程通过这一描述符引用的文件上的任何一把锁都会释放。
(2)有fork产生的子进程不会继承父进程所设置的锁。
(3)在执行exec后,新程序可以继承原执行程序的锁。如果一个文件描述符被设置成执行时关闭,那么exec执行后,进程通过该文件描述符引用的文件上的所有锁都会被释放。