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

时间:2015-09-26 14:40:06

标签: windows unix go file-locking flock

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

  1. 进程应该能够读取文件,而不管其他进程是否锁定了要写入的文件
  2. 进程应该在写入文件之前获取写锁定。这是为了确保多个进程无法写入同一个文件
  3. 进程不应该等待获取写锁定,如果它无法获得锁定它应该继续
  4. 对于基于UNIX的系统,GO中的syscall包定义了flock函数,可用于以下列方式实现上述行为:

    1. 在LOCK_EX |中使用syscall.flock函数LOCK_NB在写入文件之前尝试获取锁定
    2. 在从文件
    3. 中读取之前,请勿检查是否有任何锁定 GO中用于Windows的

      syscall包,不包括flock。鉴于此,我如何才能编写可以执行跨平台并具有上述行为的代码?

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

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

1 个答案:

答案 0 :(得分:0)

使用编译器标志。

Windows标志:

// +build windows,!linux
...

Linux标志:

// +build linux,!windows
...

如果您想使用平台本机锁定功能。

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

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