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



我有一个可以运行几次的程序。该程序使用一个工作目录,其中保存/操纵其运行时文件并放置结果。我想确保,如果程序的几个副本同时运行,则它们不会使用相同的文件夹。为此,我在创建工作目录中添加了一个隐藏的文件,这意味着正在使用该目录,并在程序退出时将其删除。当程序要使用某个目录作为其工作目录时,它将检查该文件是否存在,如果没有,则将使用该目录,否则,它将使用附加的流程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
}

最新更新