2015-11-22 28 views
9

私のゴールーチン内でロギングファイルに追加しようとすると、不正なファイル記述子が取得されています。ゴールン不良ファイル記述子

write ./log.log: bad file descriptor

ファイルが存在し、アクセス許可のために666を有しています。最初は、それぞれの人が同時にファイルを開こうとしているからだと思いました。私はその試みを避けるためにミューテックスを実装しましたが、同じ問題がありましたので削除しました。あなたはO_WRONLYフラグを追加する必要があり

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

私は自分のコンピュータで再現できることを確認します。 – HectorJ

答えて

22

:ここでは、説明するために

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

はオープ​​ンのためのLinuxのドキュメントです:http://man7.org/linux/man-pages/man2/openat.2.html

引数のフラグは以下のいずれかを含める必要があります。アクセスモード: 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 

ので、デフォルトでは読み取り専用のファイル記述子を取得します。

+0

これは私の問題を解決しましたが、私はラッパー関数の 'os.OpenFile'メソッドで' os.O_WRONLY'を持っていました。私はそれを他の場所から呼び出して、返されたファイルから読み込もうとしていました。書き込み専用に設定されていたので、同じエラーが発生していました。 'os.O_RDWR'に変更することで修正されました。 – Lansana

関連する問題