嘗試檔案追加時遇到錯誤的檔案描述子
當嘗試在Go 程式中追加到記錄檔時,您可能會遇到以下錯誤「寫入./log.log:錯誤的檔案描述符」。儘管該文件存在並且具有適當的權限(666),但此問題仍然存在。
最初懷疑原因是多個 go 例程並發檔案存取。然而,實現互斥體卻未能解決問題。
解決方案
解決方案在於在開啟檔案時加入O_WRONLY 標誌:
if f, err := os.OpenFile("./log.log", os.O_APPEND|os.O_WRONLY, os.ModeAppend); err != nil { /*[...]*/ }
說明
說明O_RDONLY = 0x0 O_RDWR = 0x2 O_WRONLY = 0x1
根據Linux對於open的文檔,必須指定三種存取模式(O_RDONLY、O_WRONLY 或 O_RDWR)之一。這些模式分別請求以唯讀、只寫或讀/寫方式開啟檔案。
預設情況下,檔案描述子以唯讀模式打開,如/ 中的以下程式碼所確認usr/local/go/src/syscall/zerrors_linux_amd64.go:因此,明確指定O_WRONLY 可確保檔案在以下位置開啟只寫入模式,解決了最初的問題。以上是為什麼在 Go 中追加到檔案會導致「錯誤檔案描述符」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!