#include <sys/types.h>
#include <unistd.h>
#include <fcnt1.h>
int fcnt1(int f i l e d e s,int c m d,.../* struct flock * f l o c k p t r * / ) ;
返回:若成功则依赖于c m d(见下),若出错则为- 1
对于记录锁, c m d是F _ G E T L K、F _ S E T L K或F _ S E T L K W。第三个参数(称其为f l o c k p t r)
是一个指向f l o c k结构的指针。
所希望的锁类型:F _ R D L C K(共享读锁)、F _ W R L C K(独占性写锁)或F _ U N L C K(解
锁一个区域)
为了锁整个文件,通常的方法是将l _ s t a r t说明为0,l _ w h e n c e说明为S E E K _ S E T,l _ l e n说明为0。
用F _ G E T L K测试能否建立一把锁,然后用F _ S E T L K和F _ S E T L K W企图建立一
把锁,这两者不是一个原子操作。在这两个操作之间可能会有另一个进程插入并建立一把相关
的锁,使原来测试到的情况发生变化,如果不希望在建立锁时可能产生的长期阻塞,则应使用
F _ S E T L K,并对返回结果进行测试,以判别是否成功地建立了所要求的锁。
if(fcntl(fd, F_GETLK, &lock) < 0)
perror("fcntl error!");
if(lock.l_type == F_UNLCK)
return 0;
return (lock.l_pid);
}
如果存在一把锁,它阻塞由参数说明的锁,则此函数返回持有这把现存锁的进程的I D,否
则此函数返回0。通常用下面两个宏来调用此函数(它们也定义在o u r h d r. h)。
#define is_readlock(fd,offset,whence,len) \
l o c k _ t e s t ( f d , F _ R D L C K , o f f s e t , w h e n c e , l e n )
#define is_writelock(fd,offset,whence,len) \
l o c k _ t e s t ( f d , F _ W R L C K , o f f s e t , w h e n c e , l e n )