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

SIM*_*MEL 2 linux semaphore tcl

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

退出时:

if [file exists [db_work_area]/.folder_used] {
    file delete [db_work_area]/.folder_used
}
Run Code Online (Sandbox Code Playgroud)

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

sch*_*enk 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
}
Run Code Online (Sandbox Code Playgroud)

  • @potrzebie,`[open]`在Tcl中最后调用OS的`open(2)`或`CreateFile()`等,所以原子性实际上是有保证的. (2认同)