Golang flock filelocking throw panic:

我有一个修改我的配置文件的 go 程序。我试图从 main() 函数中创建一个文件锁,但它抛出了一个panic: runtime error: invalid memory address or nil pointer dereference错误。没有锁,程序按预期工作正常。抛出异常的那段代码是


lockProgram, err := os.Create("/var/.daemon.lock")

defer lockProgram.Close()

CheckForError(err)

GetLock(lockProgram, syscall.LOCK_EX)

defer UngetLock(lockProgram)

//这是在一个单独的包中


func CheckForError(e error) {

    if e != nil {

        Error.Println(e)

        panic(e)

    }

}


func GetLock(file *os.File, locktype int )  {

    fmt.Println("Acquiring lock on ", file.Name())

    syscall.Flock(int(file.Fd()), locktype)

    fmt.Println("Acquired filelock on ", file.Name())

}

func UngetLock(file *os.File)  {

    syscall.Flock(int(file.Fd()), syscall.LOCK_UN);

}

flock当我在我的配置文件上调用它时,这同样有效,但是来自不同的包,而不是主包,但是当我尝试从主包中放置锁时会抛出相同的错误。请帮我找出我在这里做错了什么。


Smart猫小萌
浏览 128回答 1
1回答

米琪卡哇伊

当创建锁时发生错误时,lockProgram将是nil. 这将导致后续(延迟)调用lockProgram.Close()失败。请注意,当您恐慌时(例如在您的CheckForError函数中),仍然会执行延迟的方法调用。这在这篇博客文章中有详细解释(重点是我的):Panic 是一个内置函数,它停止普通的控制流并开始恐慌。当函数 F 调用 panic 时,F 的执行停止,F 中任何延迟的函数都会正常执行,然后 F 返回到它的调用者。对于调用者来说,F 的行为就像是调用 panic。该过程继续向上堆栈,直到当前 goroutine 中的所有函数都返回,此时程序崩溃。解决方法:先检查错误,再延迟Close()调用:lockProgram, err := os.Create("/var/.daemon.lock")CheckForError(err)defer lockProgram.Close()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go