为了账号安全,请及时绑定邮箱和手机立即绑定

Golang flock filelocking throw panic:

Golang flock filelocking throw panic:

Go
Smart猫小萌 2021-12-07 09:28:29
我有一个修改我的配置文件的 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当我在我的配置文件上调用它时,这同样有效,但是来自不同的包,而不是主包,但是当我尝试从主包中放置锁时会抛出相同的错误。请帮我找出我在这里做错了什么。
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

当创建锁时发生错误时,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()


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信