2015-11-22 16 views
9

Ricevo un descrittore di file non valido durante il tentativo di aggiungere un file di registrazione alla mia routine go.Descrittore file errato Golang

write ./log.log: bad file descriptor

il file esiste e ha 666 per le autorizzazioni. All'inizio ho pensato che forse è perché ognuno di loro sta provando ad aprire il file allo stesso tempo. Ho implementato un mutex per cercare di evitarlo ma ho ottenuto lo stesso problema quindi l'ho rimosso.

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 
     } 
    } 
}() 
+0

Confermo di poter riprodurre sul mio computer. – HectorJ

risposta

22

è necessario aggiungere il flag O_WRONLY:

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

da spiegare, qui è il Linux Documentation per l'open: http://man7.org/linux/man-pages/man2/openat.2.html:

Le bandiere argomento deve includere una delle seguenti modalità di accesso: O_RDONLY, O_WRONLY o O_RDWR. Questi richiedono l'apertura del file read- solo, solo scrittura o lettura/scrittura, rispettivamente.

Se si seleziona /usr/local/go/src/syscall/zerrors_linux_amd64.go:660, si può vedere che:

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

Quindi per default si ottiene un descrittore di file di sola lettura.

+0

Questo ha risolto il mio problema, tranne nel mio caso ho avuto 'os.O_WRONLY' nel metodo' os.OpenFile' in una funzione wrapper, e lo stavo chiamando da altrove e provavo a leggere dal file restituito, ma ovviamente era impostato per scrivere solo così ricevevo lo stesso errore. Risolto cambiando in 'os.O_RDWR'. – Lansana

Problemi correlati