2016-01-10 23 views
1

我有一个去程序,修改我的配置文件。我正在尝试从main()函数内创建一个文件锁,但它会抛出一个panic: runtime error: invalid memory address or nil pointer dereference错误。没有锁定,程序正常工作正常。抛出异常的代码段是Golang flock filelocking引发恐慌:运行时错误:无效的内存地址或零指针取消引用

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工作,但是从不同的包,不是主包,但是当我尝试从主包中放入锁时会抛出相同的错误。请帮助我找出我在这里做错了什么。

+0

你调用检查错误之前推迟。如果出现错误,该文件将为零。 – JimB

+0

@JimB,如果我错了,请纠正我,但推迟是堆叠的,只有在函数即将完成时才会执行,对吗?它可以造成问题吗? – nohup

+1

这没关系。如果你的函数结束并且'lockProgram'为零,你会感到恐慌。如果你想推迟关闭,你需要检查错误并提前回来 – JimB

回答

1

创建锁定时发生错误时,lockProgram将为nil。这将导致对lockProgram.Close()的后续(延期)呼叫失败。

请注意,当你感到恐慌时(例如在CheckForError函数中),延迟方法调用仍将被执行。这在详细this blog article(重点煤矿)解释说:

Panic is a built-in function that stops the ordinary flow of control and begins panicking. When the function F calls panic, execution of F stops, any deferred functions in F are executed normally, and then F returns to its caller. To the caller, F then behaves like a call to panic. The process continues up the stack until all functions in the current goroutine have returned, at which point the program crashes.

解决方法:检查错误,然后再推迟Close()电话:

lockProgram, err := os.Create("/var/.daemon.lock") 
CheckForError(err) 
defer lockProgram.Close() 
相关问题