- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
5.2.3 lockf 文件控制
lockf()函数允许将文件区域用作信号量(监视锁),或用于控制对锁定进程的访问(强制模式记录锁定)。试图访问已锁定资源的其他进程将返回错误或进入休眠状态,直 到 资 源 解 除
锁定为止。当关闭文件时,将释放进程的所有锁定,即使进程仍然有打开的文件。当进程终止时,将释放进程保留的所有锁定。其函数声明如下:
//come from /usr/include/unistd.h
/* lockf is a simpler interface to the locking facilities of fcntl.
LEN is always
relative to the current file position. The CMD argument is one of the following.
This function is a cancellation point and therefore not marked with
THROW. */
# ifndef USE_FILE_OFFSET64
extern int lockf (int fd, int cmd, off_t len) wur;
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_TEST 用于检测在指定的区域中是否存在其他进程的锁定。如果该区域可访问, lockf()将返回 0,否则返回 1;在这种情况下,errno 设置为[EACCES]。F_LOCK 和 F_TLOCK 都
用于锁定文件的某个区域(如果该区域可用)。F_ULOCK 用于删除文件区域的锁定。
len 是要锁定或解锁的连续字节数。要锁定的资源从文件中当前偏移量开始,对于正 len 将向
前扩展,对于负 len 则向后扩展(直到但不包括当前偏移量的前面的字节数)。如果 len 为零,则锁定从当前偏移量到文件结尾的区域(即从当前偏移量到现有或任何将来的文件结束标志)。要锁定
一个区域,不需要将该区域分配到文件中,因为这样的锁定可以在文件结束标志之后存在。
使用 F_LOCK 或 F_TLOCK 锁定的区域可以完全或部分包含同一个进程以前锁定的区
域,或被同一个进程以前锁定的区域包含。此时,这些区域将会合并为一个区域。如果请求
要求将新元素添加到活动锁定表中,但该表已满,则会返回一个错误,并且不会锁定新区域。
F_LOCK 和 F_TLOCK 请求仅在采取的操作上有所差异(如果资源不可用)。如 果
区 域 已
被 其 他进程锁定,F_LOCK 将使调用进程进入休眠状态,直到该资源可用,而
F_TLOCK 则
会返回[EACCES]错误。
F_ULOCK 请求可以完全或部分释放由进程控制的一个或多个锁定区域。如果区域未完
全释放,剩余的区域仍将被进程锁定。如果该表已满,将会返回[EDEADLK]错误, 并且不会
释放请求的区域。
使用 S_ENFMT 文件模式的常规文件(未设置组执行位)将启用强制策略。启用强制策
略后,如果清除了 O_NDELAY,访问锁定区域的读取和写入将进入休眠状态,直到整个区域
可用为止,但是如果设置了 O_NDELAY,将会返回?1 并设置 errno。由其他系统函数(如 exec())
访问的文件不受强制策略的影响。
此函数调用成功后,将返回值 0;否则返回?1,并且设置 errno 以表示该错误。由于当文件的某部分被其他进程锁定后,变量 errno 将会设置为[EAGAIN]而不是
[EACCES],因此可移植应用程序应对这两个值进行预计和测试。例如: if (lockf(fd, F_TLOCK, siz) == -1) //测试锁定
if ((errno == EAGAIN) || (errno == EACCES))
…….
else if ...
/* check for other errors*/
您可能关注的文档
最近下载
- 小学数学教学中学生逻辑推理能力的培养策略教学研究课题报告.docx
- [浙江]永康市委统战部编制外工作人员招聘笔试历年参考题库附带答案详解.doc VIP
- 教你三步查看老婆微信聊天记录.docx VIP
- 2022年公务员考试内蒙古行政职业能力测验真题.doc VIP
- 兴澄特钢海洋工程用钢研究与开发现状..ppt VIP
- 运动解剖学课件.pptx VIP
- 2025年气瓶检验员考试题及答案.docx VIP
- 大学藏文四级考试题库及答案.doc VIP
- (2025秋新版)人教版三年级数学上册全册教案.pdf
- 新解读《GB_T 20970-2015石油天然气工业 井下工具 封隔器和桥塞》最新解读.docx VIP
文档评论(0)