[解決済み] lseek/write が突然 errno = 9 (Bad file descriptor) で -1 を返した。
質問
私のアプリケーションでは
lseek()
を使用して、データを書き込む位置を探します。
を使用してファイルを開くと、正常に
open()
で、私のアプリケーションは
lseek()
と
write()
を何度も繰り返しています。
ある時期に、あるユーザーに対して、簡単に再現できない。
lseek()
は-1を返し
errno
この前にファイルは閉じられておらず、ファイルハンドル (int) はリセットされていません。
この後、別のファイルが作成されます。
open()
はまた大丈夫で
lseek()
と
write()
が再び動作するようになりました。
さらに悪いことに、このユーザーはもう一度完全なシーケンスを試したところ、すべてうまくいきました。
そこで質問なのですが、OSが何らかの理由でファイルハンドルを閉じてしまうことはあるのでしょうか? 何がこれを引き起こすのでしょうか?ファイル・インデクサやファイル・スキャナのようなものでしょうか?
これを解決する最良の方法は何でしょうか。この疑似コードは最良の解決策でしょうか。 (コードのレイアウトは気にしないでください。)
int fd=open(...);
if (fd>-1) {
long result = lseek(fd,....);
if (result == -1 && errno==9) {
close(fd..); //make sure we try to close nicely
fd=open(...);
result = lseek(fd,....);
}
}
どなたか同じような経験をお持ちの方はいらっしゃいますか?
要約: ファイルのシークと書き込みが与えられた fd に対して問題なく動作し、突然理由もなく errno=9 が返される。
解決方法は?
どのような設定をされているかわかりませんが、次のようなシナリオで、そのような効果(またはそれに似たもの)が得られると思います。 私はこれを検証するためにテストしていませんので、塩漬けにしてください。
あなたが開いているファイル/デバイスがサーバーアプリケーションとして実装されている場合(例:NFS)、サーバーアプリケーションがダウン/再起動/リブートした場合に何が起こるかを考えてみてください。 クライアント側で有効だったファイルディスクリプタが、サーバー側では有効なファイルハンドルに対応しなくなる可能性があります。 これは、クライアントがEBADFを取得する一連のイベントにつながる可能性があります。
ご参考になれば幸いです。
関連
-
[解決済み】Cygwin - Makefile-error: ターゲット `main.o' のレシピに失敗しました。
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] ファイルを作成し、書き込むにはどうすればよいですか?
-
[解決済み] ファイルに行を書き込む正しい方法?
-
[解決済み] Pythonでリストをファイルに書き込む
-
[解決済み] Python の open() はファイルが存在しない場合、ファイルを作成しない
-
[解決済み] Rubyでファイルに書き込むには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】変数の警告が設定されているが使用されていない
-
[解決済み】strcmpが機能しない
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】Cygwin - Makefile-error: ターゲット `main.o' のレシピに失敗しました。
-
[解決済み] struct has no member named
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない