Неверный дескриптор файла 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
}
}
}()
Ответы
Ответ 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)
и проблема не возникла.