尝试文件追加时遇到错误的文件描述符
当尝试在 Go 例程中追加到日志文件时,您可能会遇到以下错误“写入./log.log:错误的文件描述符”。尽管该文件存在并且具有适当的权限(666),但此问题仍然存在。
最初怀疑原因是多个 go 例程并发文件访问。然而,实现互斥体未能解决问题。
解决方案
解决方案在于在打开文件时添加 O_WRONLY 标志:
if f, err := os.OpenFile("./log.log", os.O_APPEND|os.O_WRONLY, os.ModeAppend); err != nil { /*[...]*/ }
说明
根据 Linux 的 open 文档,必须指定三种访问模式(O_RDONLY、O_WRONLY 或 O_RDWR)之一。这些模式分别请求以只读、只写或读/写方式打开文件。
默认情况下,文件描述符以只读模式打开,如 / 中的以下代码所确认usr/local/go/src/syscall/zerrors_linux_amd64.go:
O_RDONLY = 0x0 O_RDWR = 0x2 O_WRONLY = 0x1
因此,显式指定 O_WRONLY 可确保文件以只写模式打开,解决了最初的问题。
以上是为什么在 Go 中追加到文件会导致'错误文件描述符”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!