如何实现在Linux中同步同一程序的多个不同副本的信号量

如何实现在Linux中同步同一程序的多个不同副本的信号量,linux,tcl,semaphore,Linux,Tcl,Semaphore,我有一个可以运行多次的程序。程序使用一个工作目录,在其中保存/操作运行时文件并放置结果。我想确保如果程序的多个副本同时运行,它们不会使用同一个文件夹。为此,我在创建工作目录时在工作目录中添加了一个隐藏文件,这意味着正在使用该目录,并在程序退出时将其删除。当一个程序想要使用某个目录作为其工作目录时,它将检查该文件是否存在,如果不存在,它将使用该目录,否则,它将使用附加进程id的同名目录。实现是:(在Tcl中) 启动时: if [file exists [db_work_area]/.folder_

我有一个可以运行多次的程序。程序使用一个工作目录,在其中保存/操作运行时文件并放置结果。我想确保如果程序的多个副本同时运行,它们不会使用同一个文件夹。为此,我在创建工作目录时在工作目录中添加了一个隐藏文件,这意味着正在使用该目录,并在程序退出时将其删除。当一个程序想要使用某个目录作为其工作目录时,它将检查该文件是否存在,如果不存在,它将使用该目录,否则,它将使用附加进程id的同名目录。实现是:(在Tcl中)

启动时:

if [file exists [db_work_area]/.folder_used] {
    reg set work_area_override [db_work_area]_[pid]
}
...
exec touch ${db_wa}/.folder_used
退出时:

if [file exists [db_work_area]/.folder_used] {
    file delete [db_work_area]/.folder_used
}

当程序的副本一次打开一个时,这种方法有效,但是我担心如果同时打开多个程序副本,它们的同步将出现问题。这意味着两个程序将一起检查该文件是否存在,并查看它是否都选择了该目录,并且只有在这之后,它们才会添加该文件。如何实现能够在运行的同一程序的多个不同副本之间进行同步的信号量?

您不应该执行
[文件存在]
操作,稍后触摸时,使用
打开
EXCL
权限下一步执行该操作效果更好

尝试使用类似这样的方法来创建文件,如果它已经以原子方式存在,则会失败

if {[catch {open ${db_wa}/.folder_used {WRONLY EXCL CREAT}} fd]} {
    # error happend, file exists
    # pick a different area
} else {
    # just close it again, like a touch to create the file
    close $fd
}

你可以在隐藏文件上使用
flock
lock
。我不认为仅仅因为你可以编写一个Tcl命令,就意味着它是操作系统的原子。有很多C语句读取Tcl命令,解释它,执行它。甚至C语句也不是原子的。@potrzebie,Tcl中的
[open]
最终调用操作系统的
open(2)
CreateFile()
等,所以原子性实际上是有保证的。@kostix是Tcl源代码,将来也保证这样做吗?记录在案的在哪里?@potrzebie这不能保证永远不变。但很可能是这样。也不能保证操作系统的“打开”命令是原子的,也不能保证物理定律明天会继续保持不变。很可能是这样。IIRC,POSIX在传入
O_EXCL
标志时对
open()
系统调用做出了一些保证。(当在本地文件系统上时,实现可能会正确地遵守这一点…)带有
EXCL
标志的Tcl的
open
最终使用相同的API。