2015-11-22 19 views
9

Gitme yordamımdaki bir günlük dosyasına eklemeye çalışırken kötü bir dosya tanıtıcısı alıyorum.Golang bozuk dosya tanıtıcı

write ./log.log: bad file descriptor

dosya var ve izinleri 666 sahiptir. İlk başta iyi düşündüm belki de her biri aynı anda dosyayı açmaya çalışıyor. Bunu denemek ve önlemek için bir muteks uyguladım ama aynı sorunu aldım, böylece onu çıkardım.

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

Bilgisayarımda çoğaltabildiğimi doğrularım. – HectorJ

cevap

22

Sen O_WRONLY bayrağı eklemeniz gerekir: http://man7.org/linux/man-pages/man2/openat.2.html:

argüman bayrakları aşağıdakilerden birini içermelidir

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

açıklamak için, burada linux açık belgelerdir erişim modları: O_RDONLY, O_WRONLY veya O_RDWR. Bu istek dosyayı açarak sadece , sadece yazabilir veya okuyabilir/okuyabilir. Eğer /usr/local/go/src/syscall/zerrors_linux_amd64.go:660 işaretlerseniz

, bunu görebilirsiniz:

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

Yani varsayılan olarak salt okunur bir dosya tanıtıcı olsun.

+0

Bu, benim durumumda bir sarıcı işlevi 'os.OpenFile' yönteminde os.O_WRONLY' vardı ve bu başka bir yerden ve geri döndü dosyadan okumaya çalışıyordu, ama benim durumumdan hariç, bu sorunu çözdü Sadece yazmaya ayarlanmıştı, böylece aynı hatayı alıyordum. 'Os.O_RDWR'ye değiştirerek düzeltildi. – Lansana