【发布时间】:2015-09-26 14:40:05
【问题描述】:
我需要在 GO 中实现以下行为:
- 一个进程应该能够读取文件,而不管是否有任何其他进程锁定了文件以进行写入
- 进程在写入文件之前应该获得一个写锁。这是为了确保多个进程不能写入同一个文件
- 进程不应该等待获得写锁,如果它不能获得锁,它应该继续前进
对于基于UNIX的系统,GO中的syscall包定义了flock函数,可以通过以下方式实现上述行为:
- 使用 syscall.flock 函数和 LOCK_EX | LOCK_NB 在写入文件之前尝试获取锁
- 在读取文件之前不要检查任何锁
GO 中的 Windows 系统调用包,不包括群。鉴于此,我怎样才能最好地编写可以跨平台执行并具有上述行为的代码?
我想尝试在不进行特定于操作系统的调用或使用不安全的情况下实现这一目标。
PS:我不想要强制文件锁定,进程会在执行文件操作之前检查文件锁定
【问题讨论】:
-
我不是要求强制文件锁定
-
好的,您只需要在 Windows 上使用 LockFile[Ex]。我认为您将不得不使用那个 win cgo(也许有一种方法可以通过系统调用从系统 dll 中获取它;抱歉,不是 windows 人)
-
@JimB 但有没有其他方法无需调用系统特定调用和使用不安全?
-
也许您可以使用套接字或其他东西间接地做到这一点,与文件本身分开?
-
您需要使用某种特定于系统的调用,因为您需要特定于系统的行为。即使你使用代理来锁定某种类型的锁,就像程序通常在 unix 上使用符号链接一样,它仍然是特定于 windows 的。
标签: windows unix go file-locking flock