折叠 编辑本段 函数声明
/* 'lockf' is a simpler interface to the locking facilities of 'fcntl'. LEN is always relativ到规胶坐血想项e to the current file position. The CMD argument is one of the following. Thi来自s function is a cancellation point and therefore not marked with __THROW合季威信集者. */
#include <unistd.h>
int lockf(int f360百科d, int cmd, off_t 积主再均衡轴断杂从且len);
①fd 是打开文件的文件描述符。
为通过此函数调用建立锁定,文件描述符必须使坐数用只写权限(O_WRONLY)或读写权限比两研器(O_RDWR)菜频府打开。如果调用进程是样听电信浓真什守地临移具有PRIV_LOCKRDONLY 权限的组的成员,它也可以使用lockf()来锁定使用只读胡思费圆动致适双弱汽苏权限(O_RDONLY)打开的文件。
②cmd 是指定要采取的操作的控制值,允许的值在中定杀体分士补析斗己无济义。
如下所示:
# define F_ULOCK 0 //解锁
# define F_LOCK 1 //互斥锁定区域
# define F_TLOCK 2 //测试互斥锁定区域
# define F_TEST 3 //测试区域
F_ULOCK 请求可以完全或部分释放由进程控制的三地良征起流地述投一个或多个锁定区域。如果区域未完全释放,剩余的区域仍将被进程锁定。如果该表汉送验整巴斤已满,将会返回[EDEADLK]错误,并如黑且不会释放请求的区域。
使用 F_LOCK 或 F_TL展地OCK 锁定的区域可以完全或部分包含同一个正著占速丝将似之校进程以前锁定的区域,或被同一个进程以前锁定的区域包含。此时,高镇这些区域将会合并为一个至案兴房往概区域。如果请求要求将新元素添加到活动锁定表中再,但该表已满,则会返回一个错误,并且不会锁定新区域。
F_LOCK 和 F_TLOCK 请求仅在采取的操作上有所差异(如果资源不可用以至情联景给神范训论二)。如果区域已被其他进程锁交材速用定,F_LOCK 将使调用进程进入休眠状态,直到该资源可用,而 F_TLOCK 则会返回[EACCES]错误。
F_TEST 用于检测在指定的区域中是否存在其他进程的锁定。如果该区域被锁定,lockf()将返回 -1,否则返回0;在这种与立歌标西绿情况下,errno 设置为[EACCES]。F_LOCK 和 F_TLOCK 都用于锁定文件的某个区域(如果该区域可用)。F_ULOCK 用于删除文件区域的锁定。
③l也理叫以维案叶en是要锁定或解锁的连续字节数。
要锁定的资源从文件中当前偏移量开始,对于正 len 将向前扩展,对于负 len 则向后扩展(直到但不包括当前偏移量的前面的字节数)。如果 len 为零,则锁定从当前偏移量到文件结尾的区域(即从当前偏移量到现有或任何将来的文件结束标志)。要锁定放刚抗款一个区域,不需要将该区域分配到文件中,因为这样的锁定可以在文件结束标志之后存在。
使用 S_ENFMT 文件模式的常规文件(未设置组执行位)将启用强制策略示笔镇深然威季罪效。启用强制策略后,如果清乐探期散慢特还件除了 O_NDELAY,访问锁定区域的读取和写入将进入休眠状态,直到整个区域属可用为止,但是如果设置了O_NDELAY,将会返回−1并设置 errno。由其他系统函数(如 exec())访问的文件不受强制策略的影响。
折叠 编辑本段 返回值
此函数调用成功后,将返回值 0,否则返回−1,并且设置 errno 以表示该错误。 由于当文件的某部分被其他进程锁定后,变量 errno 将会设置为[EAGAIN]而不是[EACCES],因此可移植应用程抗七立修限企聚穿坏货序应对这两个值进行预计和测试。例如:
if (lockf(fd置客, F_TLOCK, si率农波见z) == -1) //测试锁定
if ((errno == EAGAIN) || (errno == EACCES))
…….
else if 示不三断虽...
/* che微ck for other errors*/