Подтвердить что ты не робот

Неверный дескриптор файла Golang

Я получаю плохой файловый дескриптор при попытке добавить файл журнала в мою рутину.

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
        }
    }
}()
4b9b3361

Ответ 1

Вам нужно добавить флаг 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. Этим просьба открыть файл read-        только для записи или только для чтения и записи, соответственно.

Если вы проверите /usr/local/go/src/syscall/zerrors_linux_amd64.go:660, вы увидите, что:

O_RDONLY                         = 0x0
O_RDWR                           = 0x2
O_WRONLY                         = 0x1

Таким образом, по умолчанию вы получаете дескриптор файла только read-.

Ответ 2

это использовалось для меня

код перед:

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)

и проблема не возникла.