在linux上使用mkdir作为基于文件的锁定是一种好的做法吗?

在linux上使用mkdir作为基于文件的锁定是一种好的做法吗?,linux,locking,Linux,Locking,我想在linux上快速地在perl程序中实现某种锁定,这种锁定可以在不同进程之间共享 因此,我使用了mkdir作为原子操作,如果目录不存在,则返回1,如果目录存在,则返回0。我删除了关键部分之后的目录 现在,有人告诉我,一般来说,这不是一个好的实践(独立于语言)。我认为这很好,但我想问问你的意见 编辑: 举个例子,我的代码如下所示: while (!mkdir "lock_dir") {wait some time} critical section rmdir "lock_dir" 我认为这

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

因此,我使用了
mkdir
作为原子操作,如果目录不存在,则返回
1
,如果目录存在,则返回
0
。我删除了关键部分之后的目录

现在,有人告诉我,一般来说,这不是一个好的实践(独立于语言)。我认为这很好,但我想问问你的意见

编辑: 举个例子,我的代码如下所示:

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

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

在目录存在时发生意外故障(例如程序崩溃、电源故障)之前,这是正常的

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

通常我会使用带锁的flock

打开一个文件进行读写,如果它不存在,就创建它。然后使用独占锁,如果失败(如果使用lock_NB),则其他进程会将其锁定

锁定后,需要保持文件打开


这种方法的优点是,如果进程意外死亡(例如,崩溃、终止或机器故障),锁将自动释放。

对于布尔程序的成功,不能使用backticks。另外,这些命令实际上不起作用。逃到shell中去执行mkdir肯定有点可疑。您使用的是哪种语言?tchrist:正如我在实际代码中看到的,我实际上在perl中使用了默认的mkdir。谢谢你抓住了这一点。这种黑客在没有提供更强大锁定机制的系统上很有用,但是。。。讨厌!但请参阅(使用mkdir可移植地锁定脚本)。我不会确切地称使用fuser为“可移植地锁定脚本”)是的,所以你可以在lockdir中写一个PID文件,这样下一个家伙就可以知道发生了什么,或者有一些不太复杂的撬棍逻辑。这只是火箭科学。