私の知る限り、glibc はFILE*変数を検証する方法を提供していません。
ある種の状態を維持するか、単に設定fdするだけNULLで機能しますが、ファイルを閉じた直後ではなく、リセットする前にクリーンアップルーチンに入らないように注意する必要がありますfd。Ctrl+C はシグナル (SIGINT) をプログラムに送信するため、ファイルが閉じられて fd がリセットされている間、シグナルをブロックすることができます。したがって、fcloseメインプログラムは次のようになります。
// 1. Block SIGINT
sigset_t old_mask, to_block;
sigemptyset(&to_block);
sigaddset(&to_block, SIGINT);
sigprocmask(SIG_BLOCK, &to_block, &old_mask);
// 2. Close the file and reset fd
fclose(fd);
fd = NULL;
// 3. Restore signal handling
sigprocmask(SIG_SETMASK, &old_mask, NULL);
そして、クリーンアップルーチンでは、次のことを確認する必要がありますfd。
if (fd != NULL) fclose(fd);
プログラムがマルチスレッドの場合は、pthread_sigmask代わりに使用する必要があります。
fcloseall()あなたの場合、クリーンアップルーチンでの単純な呼び出しははるかに簡単です。
あなたの質問で意味されている2番目のオプションについては、何もしないことについてです-まあ、OSはあなたのプログラムのすべてをクリーンアップします。唯一の欠点は、開いている書き込みストリームがあった場合、一部のデータがディスクに書き込まれない可能性があることです。しかし、おそらく Ctrl+C の場合は問題ありません。