我有一个可以多次运行的程序。该程序使用一个工作目录来保存/操作其运行时文件并放置结果。我想确保如果程序的多个副本同时运行,它们将不会使用相同的文件夹。为此,我在工作目录中创建一个隐藏文件,这意味着正在使用该目录,并在程序退出时将其删除。当程序想要使用某个目录作为其工作目录时,它将检查该文件是否存在,如果不存在,它将使用该目录,否则,它将使用同名的目录及其附加的进程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
}
当程序的副本一次打开时,这是有效的,但是如果同时打开程序的多个副本,我担心它们的同步会出现问题。这意味着两个程序将检查文件是否存在,并且看到它们都没有选择该目录,只有在此之后,它们才会添加该文件。如何实现能够在运行的同一程序的几个不同副本之间进行同步的信号量?
答案 0 :(得分:5)
您不应该进行[file exists]
之后触摸,使用open
以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
}