关于flock与fcntl区别

youngwolf 2012-02-01 09:51:16
看到下面这段文字,没看懂,请解释一下:
A process can never lock itself out of a file region, even when placing locks via
multiple file descriptors referring to the same file. (This contrasts with flock())


另外,如果能全面的解释一下flock与fcntl在文件锁上使用的区别,不胜感谢。
...全文
195 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
youngwolf 2012-02-01
  • 打赏
  • 举报
回复
fcntl:
A process can never lock itself out of a file region, even when placing locks via
multiple file descriptors referring to the same file. (This contrasts with flock())

flock:
Thus, a process can lock itself out of a file using flock(). As we’ll see later, this can’t
happen with record locks obtained by fcntl().

一开始我认为这两者说的是同一件事,后来越发的理解了:
它们说的是两件事:1.fcntl只能lock在文件大小范围之内,flock则不同(它对整个文件锁嘛,可以理解);
2.flock可以在同一个文件上锁住自己,则fcntl不会.

后来我又仔细看了fcntl,它是可以锁住超过文件长度的范围的(但只能向文件尾后超),这又让我疑惑了,看来这两段还真说的是一个意思,说白了,就是:
flock和fcntl都是对文件而不是文件描述符加锁,所以当两次打开同一个文件,对这两个fd用flock锁的时候,后一个被阻塞了;同理,如果对这两个fd用fcntl锁的时候,close掉其中一个fd,另外一个fd的锁也丢失了,可见也是对文件不对文件描述符加锁。但fcntl有一点不同于flock,它是按进程为单位对文件进行加锁的,对于前面说的两个fd,它们指向同一文件,当第一个被锁之后,第二个仍然可以加锁,因为站在进程的角度来看,对一个已经被自己锁住的文件再加锁(fcntl),是可以的。
justkk 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yang79tao 的回复:]

这英文真是,琢磨半天,可能要这样理解:
lock itself out of a file region
里面的out of是超出离开的意思,就是超出文件现在的大小范围(跟楼上理解差不多)
[/Quote]

不同意
这里应该也是lock out短语,意思是在同一个文件区域上锁住自己
justkk 2012-02-01
  • 打赏
  • 举报
回复
apue 中对于flock()描述不多

最好只使用fcntl、flock中的一个,避免麻烦
个人倾向于fcntl,兼容性要好一些
justkk 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yang79tao 的回复:]
lock itself out of a file using flock()
里面的out of不再是个短语,out应该与前面的lock结合成lock out短语
意思就是把自己锁在一个文件的外面……
[/Quote]

赞同lz的lock out

对于flock,会在同一个文件上锁住自己
对于fcntl,不会在同一个文件上锁住自己,因为:
At any time, a process can hold just one type of lock on a particular region of a
file. Placing a new lock on a region we have already locked either results in no
change (if the lock type is the same as the existing lock) or atomically converts
the existing lock to the new mode.
qq120848369 2012-02-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 justkk 的回复:]

呵呵 4楼 7楼 有点矛盾
[/Quote]

的确= =。 还是看7楼吧,刚才看了man的。
justkk 2012-02-01
  • 打赏
  • 举报
回复
呵呵 4楼 7楼 有点矛盾
qq120848369 2012-02-01
  • 打赏
  • 举报
回复
flock就是文件锁,相当于一个互斥锁。
fcntl就灵活多了,可以锁任何偏移量,并且可以超越文件大小。
youngwolf 2012-02-01
  • 打赏
  • 举报
回复
这英文真是,琢磨半天,可能要这样理解:
lock itself out of a file region
里面的out of是超出离开的意思,就是超出文件现在的大小范围(跟楼上理解差不多)

lock itself out of a file using flock()
里面的out of不再是个短语,out应该与前面的lock结合成lock out短语
意思就是把自己锁在一个文件的外面,比如:
fd1 = open("a.txt", O_RDWR);
fd2 = open("a.txt", O_RDWR);
flock(fd1, LOCK_EX);
flock(fd2, LOCK_EX); /* Locked out by lock on 'fd1' */

其实这两者说的根本就不是一回事!
qq120848369 2012-02-01
  • 打赏
  • 举报
回复
我查了一下man,flock主要体现在dup2/fork以及多次open the same file时候, 对多描述符做操作时候的结果不同,没什么太特殊的,我建议使用fcntl更加简便。
qq120848369 2012-02-01
  • 打赏
  • 举报
回复
就是flock可以锁超过文件大小的偏移量,fcntl不行。
youngwolf 2012-02-01
  • 打赏
  • 举报
回复
在介绍flock的时候,是这样说的:
Thus, a process can lock itself out of a file using flock(). As we’ll see later, this can’t
happen with record locks obtained by fcntl().

同样,这里的lock itself out of a file仍然理解不了!
youngwolf 2012-02-01
  • 打赏
  • 举报
回复
《The Linux Programming Interface》
第55章第1128页
justkk 2012-02-01
  • 打赏
  • 举报
回复
这段话是哪儿的?

貌似flock只能锁定整个文件,而不能锁定其中的某个区域
justkk 2012-02-01
  • 打赏
  • 举报
回复
fd1 解锁并不影响fd2 上的锁,那就是flock不是基于文件的
youngwolf 2012-02-01
  • 打赏
  • 举报
回复
open file description与file descriptor不一样。前者是system wide的,后者就是open返回的。

文件系统三个层次:
the per-process file descriptor table;
the system-wide table of open file descriptions;
the file system i-node table.

我的意思是,flock不在第一个层次上,至少在后面两个层次上。因为在第一个层次上,fd1和fd2是完全不一样的(只是碰巧指向同一个open file description而已),但到了第二个层次,就一样了。
youngwolf 2012-02-01
  • 打赏
  • 举报
回复
fd1 = open("a.txt", O_RDWR);
fd2 = open("a.txt", O_RDWR);
flock(fd1, LOCK_EX);
flock(fd2, LOCK_EX); /* Locked out by lock on 'fd1' */

这段代码我前面引用过,本来就来自《he Linux Programming Interface》
justkk 2012-02-01
  • 打赏
  • 举报
回复
flock 不是对文件加锁的吧

A file lock obtained via flock() is associated with the open file description (Section 5.4), rather
than the file descriptor or the file (i-node) itself.

However, if we use open() to obtain a second file descriptor (and associated
open file description) referring to the same file, this second descriptor is treated
independently by flock().

我手头没有linux环境,lz可以试验一下

fd1 = open("a.txt", O_RDWR);
fd2 = open("a.txt", O_RDWR);
flock(fd1, LOCK_SH); // fd1 加读锁
flock(fd2, LOCK_SH); // fd2 加读锁
flock(fd1, LOCK_UN); // fd1 解锁
flock(fd2, LOCK_EX); // fd2 加写锁,看是否阻塞?

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧