【问题标题】:How to lock/unlock a file across process?如何跨进程锁定/解锁文件?
【发布时间】:2016-02-16 22:43:57
【问题描述】:

在 Linux 上使用在 mono 上运行的 C#,请注意以下代码在 windows 上运行良好,可以跨进程锁定文件,但在 linux 上不能通过 mono (ubuntu 14.04)

new FileStream("myfile.lock",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);

从网上研究,我应该可以用advisory lock做到这一点

FileStream.Lock

但是,它不起作用。在 ubuntu 14.04 上用两个进程测试,它们都可以执行“FileStream.Lock(0, int.MaxValue)”。我希望后一个会因source code 的异常而失败。

有人知道有什么解决办法吗?

【问题讨论】:

  • 当你说它不起作用时,你的意思是什么(?),因为任何其他进程都可以更新文件(假设它具有安全访问权限)。仅供参考:FileStream.Lock(通过 Mono)使用 fcntlF_SETLK
  • @SushiHangover,我更新了我的问题以获取有关“不起作用”的更多详细信息。我测试了两个进程,他们都尝试执行“FileStream.Lock”,我期待其中一个应该抛出错误,但没有。

标签: c# linux mono locking


【解决方案1】:

从单声道邮件列表“http://mono.1490590.n4.nabble.com/File-Locking-td4663839.html”获取帮助

以下是“爱德华·内德·哈维(单声道)”的答案引述

有点意思。根本问题是 OSX、Linux 和 Windows 有不同的底层文件锁定结构,当然, 甚至在使用 哪个 文件系统方面也存在一些差异。 我没有彻底弄清楚每个操作系统的所有答案或 文件系统,我不知道在什么情况下这会很好 够了,但这是我最终使用的,在条件下工作 我们需要它来工作:

using (var foo = new FileStream(filePath, FileMode.Open,FileAccess.ReadWrite, FileShare.None)) { // must include Write access in order to lock file 
    foo.Lock(0, 0); // 0,0 has special meaning to lock entire file regardless of length 
}

对于 Windows,只需指定 FileAccess 和 FileShare 即可 足够的。对于linux,至少是ext4,文件是并发可读的 无论您为 FileAccess 和 FileShare 指定什么。这 Lock() 方法做了一些软锁。不强制执行 操作系统,但至少在我们尝试过的所有情况下,其他客户端应用程序都很荣幸 锁。没有深入研究。

【讨论】:

  • 如果有锁的进程异常退出,会不会释放mono linux上的锁?
  • 是的,它释放了mono linux上的锁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 2021-03-29
相关资源
最近更新 更多