有没有大神了解 Linux 中创建文件当做锁有什么特点

2019-09-04 14:59:27 +08:00
 blueberryman

我今天看到一种写法,创建了一个文件当做锁。这种写法相比管道,信号有什么优缺点呢?为啥我们自己写,包括面试官面试从没有遇到过这种答案啊~谢谢各位大佬了~~~

3843 次点击
所在节点    程序员
36 条回复
lithiumii
2019-09-04 15:04:04 +08:00
flock ?挺常见的吧
lihongjie0209
2019-09-04 15:11:13 +08:00
简单啊,要什么自行车
zarte
2019-09-04 15:25:07 +08:00
不是每种语言都有管道信号这东东
tabris17
2019-09-04 15:36:46 +08:00
flock 的性能比 posix 信号量差一个数量级,但是也不算很糟糕,够用。而且大多数语言都有实现 flcok
reus
2019-09-04 15:37:20 +08:00
flock 是系统调用,很常见的东西


@zarte 这些都有操作系统提供的实现,大部分语言都能用
momocraft
2019-09-04 15:54:02 +08:00
你说的是 pid file 吗?
Mirana
2019-09-04 17:03:43 +08:00
信号能实现多进程间的互斥吗。。
ipwx
2019-09-04 17:25:13 +08:00
nfs 支持文件锁,虽然不知道一致性有多好。这可是通用版低配版的 zookeeper 啊
foreverfuck
2019-09-04 17:54:32 +08:00
文件锁不错,单机可以,多台服务器的话,如果通过文件共享来锁的话,就尴尬了。还有一点,就是死锁卡住就操蛋
blueberryman
2019-09-04 20:43:14 +08:00
@lithiumii 不是 flock,它只是当做 mutex 用。如果想执行类似于访问可重入资源的问题就会看这个文件是否存在来判断下一步的操作
blueberryman
2019-09-04 20:44:12 +08:00
@lihongjie0209 我也觉得挺简单的,open 一下就完了,但是这种方法有啥缺点呢?而且优点只是简单吗?
blueberryman
2019-09-04 20:46:16 +08:00
@momocraft 对对对,那个宏就叫这个名字,我都不知道怎么百度,这东西可以被管道,fifo 什么的替代吗?或者说有这个了我还需要管道吗
wd
2019-09-04 20:46:53 +08:00
不同程序间配合可以用这个吧,比较简单。比如 shell 程序间想并行又有依赖的时候可以通过这个实现
blueberryman
2019-09-04 20:47:44 +08:00
@zarte 我们用的是 c,上来建了一个这个文件,说是为了防止 telnet 登录,我就想了,管道也是文件啊,那我干嘛还要用管道啊,废弃它吧
blueberryman
2019-09-04 20:48:30 +08:00
@tabris17 好像不是 flock,文件的内容不重要,只关心文件是否存在,如果存在就不允许 telnet
blueberryman
2019-09-04 20:49:50 +08:00
@Mirana 信号好像可以吧,我这个最终是标记允不允许 telnet
blueberryman
2019-09-04 20:50:36 +08:00
@wd 有依赖?你的意思是互斥资源吗?
blueberryman
2019-09-04 20:51:39 +08:00
@foreverfuck 好像不是文件锁,文件内容不重要,只关心文件是否存在
FrankHB
2019-09-04 20:55:40 +08:00
看起来不是 flock,是 /var/lib/pacman/db.lck 之类的吧……实现容易,可移植性(跨操作系统、体系结构和语言)好,外部可见可查询状态允许多实例共享,程序中途挂掉状态维护失败留下烂摊子时在用户界面就能干掉,必要时可以方便附加元数据(文件属性和内容)。
管道和 FIFO 之类比普通文件可移植性差。至少 Windows 上就那么容易用。
FrankHB
2019-09-04 20:56:28 +08:00
就那么容易用→就没那么容易用……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/597865

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX