lockfx , lockf , flock 或 lockf64 子例程

用途

锁定和解锁打开文件的部分。

lockfxlockf: 标准 C 库 (libc.a)

描述
flock: Berkeley 兼容性库 (libbsd.a)

语法

#include <fcntl.h>
int lockfx (FileDescriptor,
Command, Argument)
int  FileDescriptor;
int  Command;
struct flock * Argument;
#include <sys/lockf.h>
#include <unistd.h>
int lockf
(
FileDescriptor, Request, Size)
int FileDescriptor;
int  Request;
off_t  Size;
int lockf64 (FileDescriptor,
Request
, Size)
int FileDescriptor;
int  Request;
off64_t  Size;
#include <sys/file.h>
int flock (FileDescriptor,  Operation)
int FileDescriptor;
int Operation;

描述

注意: 当与文件锁定配合使用时,缓冲 I/O 无法正常工作。 请勿在将要锁定的文件上使用标准 I/O 包例程。

lockfx 子例程锁定和解锁打开文件的部分。 lockfx 子例程提供了由 fcntl 子例程提供的锁定函数的子集。

lockf 子例程还会锁定和解锁打开文件的部分。 但是,其接口仅限于设置仅写 (互斥) 锁定。

虽然 lockfxlockfflock fcntl 接口都不同,但它们的实现是完全集成的。 因此,从一个子例程获取的锁定被任何锁定子例程接受并强制实施。

创建锁定的 lockfx 子例程的 Operation 参数确定它是读锁定还是写锁定。

在其上放置写锁定的文件描述符必须已通过写访问权打开。

lockf64 等同于 lockf ,但可以给出 64 位锁定请求大小。 对于 lockf,可以使用的最大值为 OFF_MAX,对于 lockf64,最大值为 LONGLONG_MAX

在启用了大文件的编程环境中,将 lockf 重新定义为 lock64

flock 子例程锁定和解锁整个文件。 这是一个为 BSD 兼容性而维护的有限接口,尽管它的行为在几个微妙的方面与 BSD 不同。 要应用共享锁定,必须打开文件以进行读取。 要应用互斥锁定,必须打开文件以进行写入。

不会继承锁定。 因此,子进程无法解锁由父进程锁定的文件。

参数

描述
argument 一个指向类型为 flock的结构的指针,该结构在 flock.h 文件中定义。
命令 lockfx 子例程指定下列其中一个常量:
F_SETLK
设置或清除文件锁定。 该l_type flock 结构的字段指示是建立还是除去读或写锁。 如果无法设置读锁或写锁,lockfx子程序会立即返回,错误值为-1。
F_SETLKW
执行与 F_SETLK 相同的功能,除非现有锁定阻止读或写锁定。 在这种情况下,进程将休眠,直到文件的部分可自由锁定。
F_GETLK
获取阻止 flock 结构中描述的锁定的第一个锁定。 如果找到锁定,那么检索到的信息将覆盖 flock 结构中的信息。 如果未找到阻止创建此锁定的锁定,那么将以未更改的形式传回结构,但l_type字段设置为 F_UNLCK
FileDescriptor 由成功的 open fcntl 子例程返回的文件描述符,用于标识要应用或除去锁定的文件。
操作 flock 子例程指定下列其中一个常量:
位置 SH
应用共享 (读) 锁定。
位置-EX
应用互斥 (写) 锁定。
位置-NB
锁定时请勿阻塞。 此值可以使用 LOCK_SH LOCK_EX进行逻辑 OR 运算。
位置-联合国
除去锁定。
请求 lockf 子例程指定下列其中一个常量:
F_ULOCK
解锁文件中先前锁定的区域。
F_LOCK
锁定区域以供互斥 (写) 使用。 如果请求的区域与锁定的区域重叠,那么此请求会导致调用进程休眠,并在被授予锁定时恢复。
F_TEST
用于查看其他进程是否已锁定区域的测试。 如果区域已解锁,那么 lockf 子例程将返回 0。 如果区域被锁定,则返回-1并将Erno全局变量设置为 EACCES
F_TLOCK
如果另一个进程尚未锁定该区域,那么锁定该区域以供独占使用。 如果该区域已被其他进程锁定, lockf子程序将返回-1并将Erno全局变量设置为EACCES
大小 要为 lockf 子例程锁定或解锁的字节数。 区域从打开文件中的当前位置开始,如果 Size 值为正,那么向前扩展,如果 Size 值为负,那么向后扩展。 如果 Size 值为 0 ,那么区域将从当前位置开始,并向前扩展至可能的最大文件大小,包括文件结束后的未分配空间。

返回值

成功完成后,将返回值 0。 否则,返回值为-1,并设置 errno全局变量来指示错误。

错误代码

如果下列其中一项为 true ,那么 lockfx lockf flock 子例程将失败:

描述
EBADF FileDescriptor 参数不是有效的打开文件描述符。
EINVAL 函数自变量不是 F_LOCKF_TLOCKF_TESTF_ULOCK之一; 或 size 加上当前文件偏移量小于 0。
EINVAL 尝试锁定 fifo 或管道。
EDEADLK 锁定被另一个进程的锁定阻塞。 在等待另一个锁定变为空闲时将调用进程置于休眠状态将导致死锁。
ENOLCK 锁定表已满。 太多区域已锁定。
EINTR 命令参数为 F_SETLKW ,进程在等待获取锁定时接收到信号。
EOVERFLOW 第一个或如果 size 不是 0 ,那么在类型为 off_t的对象中无法正确表示所请求节中的最后一个字节。

如果下列其中一项为 true ,那么 lockfxlockf 子例程将失败:

描述
EACCES Command 参数为 F_SETLK,即l_type字段为 F_RDLCK,要锁定的文件段已被另一进程写锁定。
EACCES Command 参数为 F_SETLK,即l_type字段为 F_WRLCK,要锁定的文件段已被另一进程读锁定或写锁定。

如果以下情况成立,那么 flock 子例程将失败:

描述
EWOULDBLOCK 文件已锁定,并且指定了 LOCK_NB 选项。