【问题标题】:How to implement cross platform file lock in GOGO中如何实现跨平台文件锁
【发布时间】:2015-09-26 14:40:05
【问题描述】:

我需要在 GO 中实现以下行为:

  1. 一个进程应该能够读取文件,而不管是否有任何其他进程锁定了文件以进行写入
  2. 进程在写入文件之前应该获得一个写锁。这是为了确保多个进程不能写入同一个文件
  3. 进程不应该等待获得写锁,如果它不能获得锁,它应该继续前进

对于基于UNIX的系统,GO中的syscall包定义了flock函数,可以通过以下方式实现上述行为:

  1. 使用 syscall.flock 函数和 LOCK_EX | LOCK_NB 在写入文件之前尝试获取锁
  2. 在读取文件之前不要检查任何锁

GO 中的 Windows 系统调用包,不包括群。鉴于此,我怎样才能最好地编写可以跨平台执行并具有上述行为的代码?

我想尝试在不进行特定于操作系统的调用或使用不安全的情况下实现这一目标。

PS:我不想要强制文件锁定,进​​程会在执行文件操作之前检查文件锁定

【问题讨论】:

  • 我不是要求强制文件锁定
  • 好的,您只需要在 Windows 上使用 LockFile[Ex]。我认为您将不得不使用那个 win cgo(也许有一种方法可以通过系统调用从系统 dll 中获取它;抱歉,不是 windows 人)
  • @JimB 但有没有其他方法无需调用系统特定调用和使用不安全?
  • 也许您可以使用套接字或其他东西间接地做到这一点,与文件本身分开?
  • 您需要使用某种特定于系统的调用,因为您需要特定于系统的行为。即使你使用代理来锁定某种类型的锁,就像程序通常在 unix 上使用符号链接一样,它仍然是特定于 windows 的。

标签: windows unix go file-locking flock


【解决方案1】:

使用编译器标志。

窗口标志:

// +build windows,!linux
...

Linux 的标志:

// +build linux,!windows
...

如果你想使用平台原生锁定功能。

一种解决方法可能是跨平台分配(假设)是单例的资源,例如绑定到端口并仅依赖于一次。绑定操作的错误情况将是决定因素。

就我个人而言,我会选择使用平台原生选项并制作一个界面,以便可以轻松添加测试,从而确保事情不会中断。

【讨论】:

    猜你喜欢
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2022-01-14
    • 2018-06-24
    • 1970-01-01
    相关资源
    最近更新 更多