2012-11-11 15 views
2

我有一个可以运行多次的程序。该程序使用工作目录来保存/处理其运行时文件并放置结果。我想确保如果程序的多个副本同时运行,它们将不会使用相同的文件夹。为此,我在创建工作目录时添加一个隐藏文件,这意味着正在使用该目录,并在程序退出时将其删除。当一个程序想要使用某个目录作为其工作目录时,它将检查该文件是否存在,如果不存在,它将使用该目录,否则它将使用与其进程ID相连的同名目录。实现如下:(在TCL)如何实现将同步Linux中同一程序的几个不同副本的信号量

在首发:

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 
} 

当程序的拷贝被打开一次一个这样的作品,但我害怕如果同时打开多个程序副本,他们的同步就会出现问题。这意味着两个程序会一起检查文件是否存在,看它是否都选择了该目录,并且只有在这之后,它们才会添加该文件。我怎样才能实现一个信号量,它能够在运行同一个程序的几个不同副本之间进行同步?

+1

您可以在隐藏文件上使用'flock'或'lockf'。 –

回答

5

你不应该做一个[file exists]和后来的触摸,它更好地使用openEXCL权限一步完成它。

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

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 
} 
+0

我不认为仅仅因为你可以将一些东西写成一个Tcl命令,这意味着它对操作系统来说是原子的。有很多C语句读取Tcl命令,很多解释它并且执行它很多。甚至C语句也不是原子的。 – potrzebie

+1

@potrzebie,最后Tcl中的'[open]'调用操作系统的'open(2)'或'CreateFile()'等,所以原子性实际上是有保证的。 – kostix

+0

@kostix Tcl源代码是否保证在未来也能做到这一点?记录在哪里? – potrzebie

相关问题