5.2.3 lockf 文件控制

 

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*/

 

补充:关于lockf的讨论与提问:

问:

(1) 进程的创建  
  编写一段程序,使用系统调用fork(   )创建两个子进程。当此程序运行时,在系统有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。  
  (2) 进程的控制  
  修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。  
  如果在程序中使用系统调用lockf(   )来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。  
   
   
  以上是我们的操作系统老师给的题目,调用lockf()   实现进程互斥,但我找了很多资料,有些地方有提到有这样一个函数但又没说明,而更多的说lockf()   为对文件上锁的函数,请高手指点。  

答:lockf实际上是用来锁文件,两个进程同时去锁定一个文件的时候,其中没锁上的那个会导致阻塞,就是这样用的。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

helihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值