我有一个可以运行几次的程序。该程序使用一个工作目录,其中保存/操纵其运行时文件并放置结果。我想确保,如果程序的几个副本同时运行,则它们不会使用相同的文件夹。为此,我在创建工作目录中添加了一个隐藏的文件,这意味着正在使用该目录,并在程序退出时将其删除。当程序要使用某个目录作为其工作目录时,它将检查该文件是否存在,如果没有,则将使用该目录,否则,它将使用附加的流程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
}
当程序的副本一次打开时,这起作用了,但是我担心如果程序的几个副本同时打开,它们的同步会存在问题。这意味着两个程序将检查文件是否存在在一起,看到它既不能选择该目录,又不会在此之后添加文件。我如何实现能够在运行同一程序的几个不同副本之间同步的信号?
您不应该执行[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
}