如何在GO中实现跨平台文件锁

3
我需要在GO中实现以下行为:
  1. 一个进程应该能够读取一个文件,而不管任何其他进程是否将该文件锁定以进行写操作
  2. 在写入文件之前,进程应该获得一个写锁。这是为了确保多个进程不能向同一文件写入
  3. 如果无法获得锁,则进程不应等待以获得写锁,应继续执行
对于基于UNIX的系统,GO中的syscall包定义了flock函数,可以使用以下方式实现上述行为:
  1. 使用syscall.flock函数和LOCK_EX | LOCK_NB来尝试在写入文件之前获取锁
  2. 在从文件中读取之前不检查任何锁定
GO中的Windows syscall包不包括flock。鉴于此,如何编写代码以跨平台执行并具有上述行为最佳?
我想尽量在不使用特定于操作系统的调用或不安全的情况下实现此目标。
PS:我不想强制文件锁定,进程将在执行文件操作之前检查文件锁定。

我并不要求强制文件锁定。 - coder_bro
好的,你只需要在Windows上使用LockFile [Ex]。我认为你将不得不钩入那个win cgo(也许有一种通过syscall从系统dll获取它的方法;抱歉,我不是一个windows专家)。 - JimB
@JimB 但是有没有其他方法,而不必调用特定于系统的调用并使用不安全的代码? - coder_bro
也许你可以间接地使用套接字或其他方式来实现,与文件本身分离? - Not_a_Golfer
1
你需要使用某种系统特定的调用,因为你想要系统特定的行为。即使你像Unix上的程序经常使用符号链接一样使用锁的代理,它仍然会针对Windows进行特定的处理。 - JimB
显示剩余2条评论
1个回答

0

使用编译器标志。

Windows的标志:

// +build windows,!linux
...

Linux 的标志:

// +build linux,!windows
...

如果您想使用平台本地锁定功能。
一种解决方法可能是分配跨平台的(假定为)单例资源,例如绑定到端口并依赖于仅能进行一次。绑定操作的错误条件将是决定性因素。
个人而言,我会选择使用平台本地选项,并创建一个接口,以便可以轻松添加测试,并确保事情不会出错。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接