flocksyscall

代码如下:

package main

import (
	"syscall"
	"unsafe"
)

func main() {
	file, err := os.OpenFile("test.lock", os.O_RDWR|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer file.Close()

	err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
	if err != nil {
		if err == syscall.EWOULDBLOCK {
			fmt.Println("file is locked")
			return
		}
		fmt.Println(err)
		return
	}

	// 文件已锁定,该进程可以进行其他操作
	fmt.Println("file is locked by this process")
}

请注意,文件锁是比较底层的技术,并不能在所有操作系统上完全实现。例如,在 NFS 上使用文件锁可能会有问题。在这种情况下,应该使用其他方法,例如数据库事务或分布式锁。