だから私はかなり長い間fcloseマンページを勉強しています.私の結論は、マンページによると、fcloseが何らかの信号によって中断された場合、回復する方法はないということです...? 私はいくつかのポイントを逃していますか?
通常、バッファリングされていない POSIX 関数 (open、close、write など) では、呼び出しを再開することでシグナル割り込み (EINTR) から回復する方法が常にあります。対照的に、バッファリングされた呼び出しのドキュメントには、 fclose の試行が失敗した後、別の試行で未定義の動作が発生することが記載されています...代わりに回復する方法についてのヒントはありません。シグナルが fclose を中断した場合、私は「運が悪い」だけですか? データが失われる可能性があり、ファイル記述子が実際に閉じられているかどうかはわかりません。バッファが割り当て解除されていることは知っていますが、ファイル記述子はどうですか? 多数の fd を同時に使用し、fd が適切に解放されていない場合に問題が発生する大規模なアプリケーションについて考えてみてください -> この問題に対するクリーンな解決策が必要であると思います。
ライブラリを作成していて、sigaction と SA_RESTART の使用が許可されておらず、多くのシグナルが送信されていると仮定しましょう。fclose が中断された場合、どうすれば回復できますか? fclose が EINTR で失敗した後、(fclose の代わりに) ループで close を呼び出すのは良い考えでしょうか? fclose のドキュメントでは、ファイル記述子の状態について言及していません。ただし、 UNDEFINEDはあまり役に立ちません... fd が閉じられているときにもう一度 close を呼び出すと、デバッグが困難な奇妙な副作用が発生する可能性があるため、当然、このケースは間違ったことをしているので無視したいと思います...利用可能なファイル記述子の数に制限はなく、リソースのリークはある種のバグです (少なくとも私にとっては)。
もちろん、fclose の特定の実装を確認することはできますが、誰かが stdio を設計し、この問題について考えなかったとは信じられませんか? 悪いのはドキュメントだけですか、それともこの関数の設計ですか?
このコーナーケースは本当に私を悩ませます:(