3 回答
TA贡献1827条经验 获得超7个赞
您需要添加O_WRONLY标志:
if f, err := os.OpenFile("./log.log", os.O_APPEND|os.O_WRONLY, os.ModeAppend); err != nil { /*[...]*/ }
为了解释一下,这里是 linux 文档open:http : //man7.org/linux/man-pages/man2/openat.2.html:
参数标志必须包括以下访问模式之一:O_RDONLY、O_WRONLY 或 O_RDWR。这些请求分别以只读、只写或读/写方式打开文件。
如果您检查/usr/local/go/src/syscall/zerrors_linux_amd64.go:660,您可以看到:
O_RDONLY = 0x0
O_RDWR = 0x2
O_WRONLY = 0x1
所以默认情况下你会得到一个只读的文件描述符。
TA贡献1780条经验 获得超1个赞
它对我有用
之前的代码:
os.OpenFile(fileName, os.O_CREATE|os.O_APPEND, os.ModePerm)
它发生了错误:文件描述符错误,
然后我将 os.O_WRONLY 添加到函数中
之后的代码:
os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
它没有出现问题。
TA贡献1744条经验 获得超4个赞
这似乎是 windows 和 linux 之间的差异。在 windows 上 os.O_APPEND 意味着写访问,如 syscall_windows.go 中的代码所示。
if mode&O_APPEND != 0 {
access &^= GENERIC_WRITE
access |= FILE_APPEND_DATA
}
在 linux 中,openflags 按原样传递给 linux 系统调用
因此,在 DOS/WINDOWS 中,您不需要像暗示的那样显式添加带有附加标志的写入标志。(这是自 DOS 时代以来的默认行为)Linux 中的 Go 确实需要添加额外的标志才能工作。
(...但我不应该需要这个标志,因为附加隐含暗示我想写。我应该向 golang 报告这个错误吗?)
- 3 回答
- 0 关注
- 161 浏览
添加回答
举报