web-dev-qa-db-fra.com

Descripteur de mauvais fichier Golang

J'obtiens un mauvais descripteur de fichier lorsque j'essaye de l'ajouter à un fichier de journalisation dans ma routine go.

write ./log.log: bad file descriptor

Le fichier existe et dispose de 666 autorisations. Au début, j'ai pensé que c'était peut-être parce que chacun essayait d'ouvrir le fichier en même temps. J'ai implémenté un mutex pour essayer d'éviter cela, mais j'ai eu le même problème, donc je l'ai supprimé.

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
        }
    }
}()
17
Jared Mackey

Vous devez ajouter le O_WRONLY drapeau :

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

Pour expliquer, voici la documentation linux pour open: http://man7.org/linux/man-pages/man2/openat.2.html :

Les indicateurs d'argument doivent inclure l'un des modes d'accès suivants: O_RDONLY, O_WRONLY ou O_RDWR. Ceux-ci demandent respectivement l'ouverture du fichier en lecture seule, en écriture seule ou en lecture/écriture.

Si vous cochez /usr/local/go/src/syscall/zerrors_linux_AMD64.go:660, vous pouvez voir que:

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

Ainsi, par défaut, vous obtenez un descripteur de fichier en lecture seule.

39
HectorJ

ça m'a servi

le code avant:

os.OpenFile(fileName, os.O_CREATE|os.O_APPEND, os.ModePerm)

et il s'est produit l'erreur: mauvais descripteur de fichier,

puis j'ajoute l'os.O_WRONLY dans la fonction

le code après:

os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)

et le problème ne s'est pas produit.

0
jack wu