(.NET 环境)
有几个客户端机器 B ... N 访问服务器 A 上的文本文件,以便在其中添加一行(这些行是 A 做某事的指令,文件本身是一个 FIFO 指令队列)。文件很小,大部分时间都是空的。A 本身上有应用程序向此文件附加行。
机器 B 到 N 只写这个文件,但什么时候写是不可预见的,所以访问冲突很可能经常发生。
机器 A 每秒检查此文件,在执行所述指令时逐行删除所有当前存在的行 (FIFO)。当然,这里存在访问冲突的可能性很高(因为客户端当前碰巧附加到文件中),但这是非常微不足道的,因为可以简单地中止预期的操作(因为无论如何都会重试每秒发生并且计时不是那很关键)。
我的主要问题是客户端机器。我如何确保,当 A(或另一个客户端)实际操作它时,我仍然可以安全地附加到 A 上的文件?我应该遵循 A 的策略并每秒尝试一次,直到成功,或者是否有专门用于这些目的的特殊 I/O 设置?
共享单个文件使错误检测变得不可能 - 如果远程客户端在锁定文件时崩溃并且仅部分完成了写入,会发生什么?
如果您不使用锁定,您还必须担心同步更新会导致锁定和损坏。跨网络锁定文件可能会带来极大的问题。
解决此问题的最简单方法是依靠文件在同一文件系统内重命名或移动是原子的这一事实,完全消除对文件锁定和同时更新同一文件的需要。
一种方法是:
RenameFile()
在 Windows 或rename()
POSIX 系统上)重命名/移动到扫描的目录中。请注意,使用的呼叫必须是一个原子操作-无论是RenameFile()
和rename()
被记录为原子。(如果RenameFile()
不允许将文件移动到另一个目录,请让远程客户端以文件名开始,例如“ASDF.ignore”或“ASDF.inwork”,然后使用RenameFile()
删除扩展名,并让扫描过程忽略具有此类扩展名的文件。)本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句