ファイルの追加試行中に不正なファイル記述子が検出されました
Go ルーチン内でログ ファイルに追加しようとすると、エラーが発生する場合があります「./log.log を書き込みます: 不正なファイル記述子」。ファイルの存在と適切な権限 (666) にもかかわらず、この問題は解決しません。
当初、原因は複数の go ルーチンによる同時ファイル アクセスであると考えられていました。ただし、ミューテックスを実装しても問題は解決できませんでした。
解決策
解決策は、ファイルを開くときに O_WRONLY フラグを追加することです。
if f, err := os.OpenFile("./log.log", os.O_APPEND|os.O_WRONLY, os.ModeAppend); err != nil { /*[...]*/ }
説明
Linux ドキュメントによるオープンの場合、3 つのアクセス モード (O_RDONLY、O_WRONLY、または O_RDWR) のいずれかを指定する必要があります。これらのモードは、ファイルをそれぞれ読み取り専用、書き込み専用、または読み取り/書き込みで開くことを要求します。
デフォルトでは、ファイル記述子は読み取り専用モードで開かれます。/ 内の次のコードで確認できるように、ファイル記述子は読み取り専用モードで開かれます。 usr/local/go/src/syscall/zerrors_linux_amd64.go:
O_RDONLY = 0x0 O_RDWR = 0x2 O_WRONLY = 0x1
したがって、明示的に指定するO_WRONLY は、ファイルが書き込み専用モードで開かれることを保証し、最初の問題を解決します。
以上がGo でファイルに追加すると「不正なファイル記述子」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。