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 上使用文件锁可能会有问题。在这种情况下,应该使用其他方法,例如数据库事务或分布式锁。