Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何在GO中实现跨平台文件锁定_Windows_Unix_Go_File Locking_Flock - Fatal编程技术网

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

Windows 如何在GO中实现跨平台文件锁定,windows,unix,go,file-locking,flock,Windows,Unix,Go,File Locking,Flock,我需要在GO中实现以下行为: 一个进程应该能够读取一个文件,而不管是否有其他进程已锁定该文件进行写入 进程应该先获得写锁,然后才能写入文件。这是为了确保多个进程不能写入同一个文件 进程不应等待获得写锁,如果无法获得锁,则应继续 对于基于UNIX的系统,GO中的syscall包定义了flock函数,该函数可用于以以下方式实现上述行为: 将syscall.flock函数与LOCK|EX | LOCK|NB一起使用,尝试在写入文件之前获取锁 在读取文件之前,不要检查任何锁 GO中的Windows系统调

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

  • 一个进程应该能够读取一个文件,而不管是否有其他进程已锁定该文件进行写入
  • 进程应该先获得写锁,然后才能写入文件。这是为了确保多个进程不能写入同一个文件
  • 进程不应等待获得写锁,如果无法获得锁,则应继续
  • 对于基于UNIX的系统,GO中的syscall包定义了flock函数,该函数可用于以以下方式实现上述行为:

  • 将syscall.flock函数与LOCK|EX | LOCK|NB一起使用,尝试在写入文件之前获取锁
  • 在读取文件之前,不要检查任何锁
  • GO中的Windows系统调用包不包括flock。鉴于此,如何编写能够跨平台执行并具有上述行为的代码

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

    PS:我不希望强制文件锁定,进程将在执行文件操作之前检查文件锁定

    使用编译器标志

    windows的标志:

    // +build windows,!linux
    ...
    
    linux的标志:

    // +build linux,!windows
    ...
    
    如果要使用平台本机锁定功能

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


    就我个人而言,我会选择使用平台本机选项,只需制作一个界面,这样就可以轻松添加测试,从而确保不会出现问题。

    我不是要求强制文件锁定OK,您只需要在windows上使用LockFile[Ex]。我认为您必须连接到win cgo(可能有一种方法可以通过syscall从系统dll获取它;对不起,不是windows guy)@JimB,但是有没有另一种方法不必调用特定于系统的调用和使用不安全的方法?也许您可以通过套接字或其他方式间接实现,与文件本身分离?您需要使用某种特定于系统的调用,因为您需要特定于系统的行为。即使您使用某种类型的锁的代理,就像unix上通常使用符号链接的程序一样,它仍然是针对windows的。