【问题标题】:TCL, Linux, and FLOCKTCL、Linux 和 FLOCK
【发布时间】:2012-08-01 20:57:28
【问题描述】:

所以我正在使用一个用 TCL 编写的程序,它使用 FLOCK 函数来锁定文件。我在比它当前运行的版本更新的 Linux 上测试它,我发现当更新的机器运行脚本时,它使用 /usr/bin/flock 中的 FLOCK,这与 FLOCK 的 TCL 版本不同。 TCL版本使用-read-write等,而Linux版本使用完全不同的选项。

简而言之,程序在执行任何 FLOCK 调用时都会停止工作并出错。如果我更改选项以适应 Linux 版本,它会破坏其他机器上的程序。

有没有办法让它使用 TCL 版本而不是 Linux 版本?

【问题讨论】:

  • 所有FLOCK命名的东西都将通过内核的flock(2)fcntl(2)锁定接口; flock(2) 仅供参考,不适用于 NFS,因此引入了 fcntl(2) 以提供强制锁定(很少使用)和过度 NFS 锁定。我建议阅读 flock(2) 手册页,尤其是 NOTES 部分,了解可能会帮助您更好地解释您要解决的问题的背景。
  • 嗯,TCL 脚本调用 FLOCK 并在文件上使用 -write -nowait。此脚本通常在 CentOS 5.7 上运行。当它在 Ubuntu 12.04 上运行时,FLOCK 行失败并显示“invalid command name 'flock'”。如果我将它更改为使用 Linux 手册页中的 FLOCK 选项,它将在 Ubuntu 上运行,但在 CentOS 5.7 计算机上失败。

标签: linux tcl flock


【解决方案1】:

Tcl 本身不附带flock 命令,但如果您进行交互测试,您可能会看到它自动尝试使用系统命令。系统命令的这种自动使用不是在脚本中完成的(由于路径不同,很容易出现不稳定)所以在编写脚本时你应该明确你的意思。

如果你想使用系统命令(它本身是不可移植的,尤其是对于非 Linux 系统),那么就这样做:

exec flock $options...

请注意,Tcl 对 shell 使用不同形式的参数引用。这有时会在编写exec 调用时引起人们的注意。

或者,使用TclX package 中的flock Tcl 命令。语法与 Linux 系统实用程序的语法略有不同,很大程度上是因为它的级别较低。对它有利的是,它更便携。

【讨论】:

  • 不管它的名字如何,flock 命令使用 fcntl(2) 系统 API 进行锁定。 OTOH,如果锁定文件的所有其他内容都使用系统 command 来执行此操作,那么您的脚本也应该这样做。
  • 我只记得通过安装 TclX 包解决了这个问题来结束这个问题。由于某种原因,没有它,TCL 程序在使用 FLOCK 时会不断出错。
猜你喜欢
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多