lockfx , lockf , flock 或 lockf64 子例程
用途
锁定和解锁打开文件的部分。
库
lockfx, lockf: 标准 C 库 (libc.a)
| 项 | 描述 |
|---|---|
| flock: | Berkeley 兼容性库 (libbsd.a) |
语法
#include <fcntl.h> int lockfx (FileDescriptor,
Command, Argument)
int FileDescriptor;
int Command;
struct flock * Argument;
Command, Argument)
int FileDescriptor;
int Command;
struct flock * Argument;
#include <sys/lockf.h>
#include <unistd.h>
#include <sys/file.h>
描述
注意: 当与文件锁定配合使用时,缓冲 I/O 无法正常工作。 请勿在将要锁定的文件上使用标准 I/O 包例程。
lockfx 子例程锁定和解锁打开文件的部分。 lockfx 子例程提供了由 fcntl 子例程提供的锁定函数的子集。
lockf 子例程还会锁定和解锁打开文件的部分。 但是,其接口仅限于设置仅写 (互斥) 锁定。
虽然 lockfx, lockf, flock和 fcntl 接口都不同,但它们的实现是完全集成的。 因此,从一个子例程获取的锁定被任何锁定子例程接受并强制实施。
创建锁定的 lockfx 子例程的 Operation 参数确定它是读锁定还是写锁定。
在其上放置写锁定的文件描述符必须已通过写访问权打开。
lockf64 等同于 lockf ,但可以给出 64 位锁定请求大小。 对于 lockf,可以使用的最大值为 OFF_MAX,对于 lockf64,最大值为 LONGLONG_MAX。
在启用了大文件的编程环境中,将 lockf 重新定义为 lock64。
flock 子例程锁定和解锁整个文件。 这是一个为 BSD 兼容性而维护的有限接口,尽管它的行为在几个微妙的方面与 BSD 不同。 要应用共享锁定,必须打开文件以进行读取。 要应用互斥锁定,必须打开文件以进行写入。
不会继承锁定。 因此,子进程无法解锁由父进程锁定的文件。
参数
| 项 | 描述 |
|---|---|
| argument | 一个指向类型为 flock的结构的指针,该结构在 flock.h 文件中定义。 |
| 命令 | 为 lockfx 子例程指定下列其中一个常量:
|
| FileDescriptor | 由成功的 open 或 fcntl 子例程返回的文件描述符,用于标识要应用或除去锁定的文件。 |
| 操作 | 为 flock 子例程指定下列其中一个常量:
|
| 请求 | 为 lockf 子例程指定下列其中一个常量:
|
| 大小 | 要为 lockf 子例程锁定或解锁的字节数。 区域从打开文件中的当前位置开始,如果 Size 值为正,那么向前扩展,如果 Size 值为负,那么向后扩展。 如果 Size 值为 0 ,那么区域将从当前位置开始,并向前扩展至可能的最大文件大小,包括文件结束后的未分配空间。 |
返回值
成功完成后,将返回值 0。 否则,返回值为-1,并设置 errno全局变量来指示错误。
错误代码
如果下列其中一项为 true ,那么 lockfx, lockf和 flock 子例程将失败:
| 项 | 描述 |
|---|---|
| EBADF | FileDescriptor 参数不是有效的打开文件描述符。 |
| EINVAL | 函数自变量不是 F_LOCK, F_TLOCK, F_TEST 或 F_ULOCK之一; 或 size 加上当前文件偏移量小于 0。 |
| EINVAL | 尝试锁定 fifo 或管道。 |
| EDEADLK | 锁定被另一个进程的锁定阻塞。 在等待另一个锁定变为空闲时将调用进程置于休眠状态将导致死锁。 |
| ENOLCK | 锁定表已满。 太多区域已锁定。 |
| EINTR | 命令参数为 F_SETLKW ,进程在等待获取锁定时接收到信号。 |
| EOVERFLOW | 第一个或如果 size 不是 0 ,那么在类型为 off_t的对象中无法正确表示所请求节中的最后一个字节。 |
如果下列其中一项为 true ,那么 lockfx 和 lockf 子例程将失败:
| 项 | 描述 |
|---|---|
| EACCES | Command 参数为 F_SETLK,即l_type字段为 F_RDLCK,要锁定的文件段已被另一进程写锁定。 |
| EACCES | Command 参数为 F_SETLK,即l_type字段为 F_WRLCK,要锁定的文件段已被另一进程读锁定或写锁定。 |
如果以下情况成立,那么 flock 子例程将失败:
| 项 | 描述 |
|---|---|
| EWOULDBLOCK | 文件已锁定,并且指定了 LOCK_NB 选项。 |