C# 如何跨进程锁定/解锁文件?

C# 如何跨进程锁定/解锁文件?,c#,linux,mono,locking,C#,Linux,Mono,Locking,在Linux上使用在mono上运行的C#,注意下面的代码在windows上运行良好,可以跨进程锁定文件,但在Linux上不能通过mono(ubuntu 14.04)锁定文件 从互联网上研究,我应该能够做到这一点 但是,它不起作用。在Ubuntu14.04上测试了两个进程,它们都可以执行“FileStream.Lock(0,int.MaxValue)”。我希望后一个会失败,每个例外 有人知道有什么解决方案吗?从mono邮件列表获取帮助“” 下面是“爱德华·内德·哈维(莫诺)”的答案 有点像。根本问

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

从互联网上研究,我应该能够做到这一点

但是,它不起作用。在Ubuntu14.04上测试了两个进程,它们都可以执行“FileStream.Lock(0,int.MaxValue)”。我希望后一个会失败,每个例外


有人知道有什么解决方案吗?

从mono邮件列表获取帮助“”

下面是“爱德华·内德·哈维(莫诺)”的答案

有点像。根本问题是OSX、Linux和Windows都 有不同的底层文件锁定结构,当然, 即使使用的是哪个文件系统,也存在一些差异。 我没有完全弄清楚每个操作系统或应用程序的所有答案 文件系统,我不知道在什么情况下这是好的 够了,但这就是我最终使用的,在这种条件下工作 我们需要它发挥作用:

对于windows,只需指定FileAccess和FileShare即可 足够地对于linux,至少ext4文件是可并发读取的 不管您为FileAccess和FileShare指定了什么。这个 Lock()方法执行某种软锁功能。它不是由政府强制执行的 操作系统,但至少在我们尝试过的所有情况下,其他客户端应用程序都是如此 锁。没有深入调查


当你说它不工作时,你的意思是什么(?)与“咨询锁”一样,任何其他进程都可以更新文件(假定它具有安全访问权限)。仅供参考:
FileStream.Lock
(通过Mono)使用
fcntl
F_SETLK
@sushingover,我更新了我的问题,以获得关于“不工作”的更多详细信息。我用两个进程进行了测试,两个进程都试图执行“FileStream.Lock”,我原以为其中一个进程会抛出错误,但没有。如果带有锁的进程异常退出,这会释放mono linux上的锁吗?是的,它会释放mono linux上的锁。
new FileStream("myfile.lock",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);
FileStream.Lock
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 
}