一尘不染

Golang错误的文件描述符

go

尝试附加到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
        }
    }
}()

阅读 328

收藏
2020-07-02

共1个答案

一尘不染

您需要添加O_WRONLY标志:

if f, err := os.OpenFile("./log.log", os.O_APPEND|os.O_WRONLY, os.ModeAppend); err != nil { /*[...]*/ }

为了说明,这是Linux文档openhttp : //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

因此,默认情况下,您将获得一个只读文件描述符。

2020-07-02