flock() - Unix、Linux系统调用
广告
名称
flock - 对打开的文件应用或移除建议锁
概要
#include <sys/file.h>
int flock(int fd, int operation);
|
描述
对由fd指定的文件应用或移除建议锁。参数operation是以下之一:
标签 | 描述 |
LOCK_SH | 设置共享锁。多个进程可以在给定时间内对给定文件持有共享锁。 |
LOCK_EX | 设置独占锁。在给定时间内,只有一个进程可以对给定文件持有独占锁。 |
LOCK_UN | 移除此进程持有的现有锁。
|
如果另一个进程持有不兼容的锁,则对flock()的调用可能会阻塞。要发出非阻塞请求,请将LOCK_NB(通过OR)与上述任何操作一起使用。
单个文件不能同时拥有共享锁和独占锁。 由flock()创建的锁与打开的文件表条目相关联。这意味着重复的文件描述符(例如,由fork(2)或dup(2)创建)引用相同的锁,并且可以使用这些描述符中的任何一个来修改或释放此锁。此外,锁通过对这些重复描述符中的任何一个进行显式LOCK_UN操作,或者当所有此类描述符都已关闭时释放。
如果一个进程使用open(2)(或类似方法)获取同一个文件的多个描述符,则这些描述符由flock()独立处理。尝试使用这些文件描述符之一锁定文件可能会被调用进程已通过另一个描述符设置的锁拒绝。
一个进程只能在一个文件上持有某种类型的锁(共享锁或独占锁)。对已锁定文件的后续flock()调用会将现有锁转换为新的锁定模式。
由flock()创建的锁在execve(2)中保留。
无论以何种模式打开文件,都可以对文件设置共享锁或独占锁。
返回值
成功时,返回零。出错时,返回-1,并适当地设置errno。
错误
错误代码 | 描述 |
EBADF |
fd不是打开的文件描述符。 |
EINTR | 在等待获取锁时,调用因处理程序捕获的信号传递而中断。 |
EINVAL |
operation无效。 |
ENOLCK | 内核内存不足,无法分配锁记录。 |
EWOULDBLOCK | 文件已锁定且已选择LOCK_NB标志。 |
符合标准4.4BSD(flock(2)调用首次出现在4.2BSD中)。大多数Unix上都出现flock(2)的版本,可能使用fcntl(2)实现。注释
flock(2)不会通过NFS锁定文件。请改用fcntl(2):在足够新的Linux版本和支持锁定的服务器上,它可以工作。
从内核2.0开始,flock(2)本身作为系统调用实现,而不是在GNU C库中作为对fcntl(2)的调用来模拟。这产生了真正的BSD语义:由flock(2)和fcntl(2)设置的锁的类型之间没有交互,并且flock(2)不检测死锁。
flock(2)只设置建议锁;如果对文件具有合适的权限,进程可以自由地忽略flock(2)的使用并在文件上执行I/O。
关于派生进程和dup(2),flock(2)和fcntl(2)锁具有不同的语义。在使用fcntl()实现flock()的系统上,flock()的语义将与本手册页中描述的不同。
转换锁(从共享到独占,反之亦然)不能保证是原子的:首先移除现有锁,然后建立新的锁。在这两个步骤之间,另一个进程的挂起锁请求可能会被授予,结果是转换阻塞或在指定LOCK_NB时失败。(这是原始的BSD行为,并且在许多其他实现中发生。)
另见
广告
|