2015-11-22 19 views
9

Tôi đang nhận được một bộ mô tả tập tin xấu khi cố gắng để nối thêm vào một tập tin đăng nhập trong thói quen đi của tôi.Golang mô tả tập tin xấu

write ./log.log: bad file descriptor

Các tập tin tồn tại và có 666 cho phép. Lúc đầu, tôi nghĩ tốt có lẽ là bởi vì mỗi người trong số họ đang cố gắng để mở tập tin cùng một lúc. Tôi đã thực hiện một mutex để thử và tránh điều đó nhưng có cùng một vấn đề nên tôi đã xóa nó.

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

Tôi xác nhận tôi có thể tái tạo trên máy tính của mình. – HectorJ

Trả lời

22

Bạn cần phải thêm O_WRONLY cờ:

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

Để giải thích, đây là tài liệu linux cho mở: http://man7.org/linux/man-pages/man2/openat.2.html:

Cờ luận phải bao gồm một trong các cách sau chế độ truy cập: O_RDONLY, O_WRONLY hoặc O_RDWR. Những yêu cầu này chỉ mở tập tin đọc , chỉ ghi, hoặc đọc/ghi.

Nếu bạn kiểm tra /usr/local/go/src/syscall/zerrors_linux_amd64.go:660, bạn có thể thấy rằng:

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

Vì vậy, theo mặc định bạn có được một bộ mô tả tập tin chỉ đọc.

+0

Điều này giải quyết được vấn đề của tôi, ngoại trừ trong trường hợp của tôi, tôi đã có 'os.O_WRONLY' trong phương thức' os.OpenFile' trong hàm wrapper, và tôi đã gọi nó từ nơi khác và cố gắng đọc từ tệp nó trả về, nhưng tất nhiên nó đã được thiết lập để chỉ ghi nên tôi đã nhận được cùng một lỗi. Đã sửa bằng cách thay đổi thành 'os.O_RDWR'. – Lansana

Các vấn đề liên quan