Golang плохой файловый дескриптор
Я получаю плохой файловый дескриптор при попытке добавить файл журнала в мою процедуру 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
}
}
}()
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:
аргумент flags должен включать один из следующих режимов доступа : Флагов 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
поэтому по умолчанию вы получаете файловый дескриптор только для чтения.