在Linux上使用mkdir作为基于文件的锁定是一种好习惯吗?

时间:2011-08-26 17:32:02

标签: linux locking

我想在linux上的perl程序中快速实现某种锁定,这可以在不同进程之间共享。

所以我使用mkdir作为原子操作,如果目录不存在则返回1,如果存在则返回0。我在关键部分之后立即删除目录。

现在,有人指出,这不是一般的好习惯(独立于语言)。我认为这很好,但我想问你的意见。

编辑: 举一个例子,我的代码看起来像这样:

while (!mkdir "lock_dir") {wait some time}
critical section
rmdir "lock_dir"

2 个答案:

答案 0 :(得分:5)

恕我直言,这是一个非常糟糕的做法。如果在关键部分创建锁目录的perl脚本以某种方式被杀死怎么办?等待锁定目录被删除的另一个perl脚本将永远等待,因为它不会被最初创建它的脚本删除。 要使用安全锁定,请在锁定文件上使用flock()(请参阅perldoc -f flock)。

答案 1 :(得分:2)

在目录存在之前发生意外故障(例如程序崩溃,电源故障)之前,这很好。

在此之后,程序将永远不会运行,因为锁被永久锁定(假设目录位于持久文件系统上)。

通常情况下,我会使用flock和LOCK_EXCL。

打开一个文件进行阅读+写作,如果它不存在则创建它。然后采取独占锁定,如果失败(如果你使用LOCK_NB),那么其他一些进程将其锁定。

获得锁定后,您需要保持文件打开状态。

这种方法的优点是,如果进程意外死亡(例如,崩溃,被杀或机器出现故障),锁会自动释放。