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

Golang 错误的文件描述符

Golang 错误的文件描述符

Go
红颜莎娜 2021-11-22 18:35:55
尝试附加到我的 go 例程中的日志文件时,我得到了一个错误的文件描述符。write ./log.log: bad file descriptor该文件存在并且具有 666 的权限。一开始我觉得很好,也许是因为他们每个人都试图同时打开文件。我实现了一个互斥锁来尝试避免这种情况,但遇到了同样的问题,所以我将其删除。logCh := make(chan string, 150)go func() {    for {        msg, ok := <-logCh        if ok {            if f, err := os.OpenFile("./log.log", os.O_APPEND, os.ModeAppend); err != nil {                panic(err)            } else {                logTime := time.Now().Format(time.RFC3339)                if _, err := f.WriteString(logTime + " - " + msg); err != nil {                    fmt.Print(err)                }                f.Close()            }        } else {            fmt.Print("Channel closed! \n")            break        }    }}()
查看完整描述

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

所以默认情况下你会得到一个只读的文件描述符。


查看完整回答
反对 回复 2021-11-22
?
慕神8447489

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)

它没有出现问题。


查看完整回答
反对 回复 2021-11-22
?
慕无忌1623718

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 报告这个错误吗?)


查看完整回答
反对 回复 2021-11-22
  • 3 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

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