gcc (GCC) 4.7.2
c89
Run Code Online (Sandbox Code Playgroud)
是否可以检查文件是否已关闭?
我已经打开了一个文件fopen()并使用了关闭fclose(fd).
在程序运行期间,此文件将被打开和关闭.但是,用户可以通过执行a来终止程序ctrl-c.
当我进入清理程序时,我不知道文件是处于打开还是关闭状态.因此,如果我尝试做fclose(fd)两次,它将堆叠转储.
我一直在扔的一些想法:
- 将状态添加到要打开或关闭的文件,然后检查该状态,意味着更多工作用于这样一个简单的工作.
- 不执行任何操作,因为操作系统将在程序结束时自动清理.
- 是否有访问功能,但这只会检查模式.
提前谢谢了,
AFAIK,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);
Run Code Online (Sandbox Code Playgroud)
在清理程序中,您应该检查fd:
if (fd != NULL) fclose(fd);
Run Code Online (Sandbox Code Playgroud)
如果你的程序是多线程的,你应该使用pthread_sigmask.
在您的情况下,fcloseall()清理例程中的简单调用将更容易.
关于你问题中的第二个选项,关于什么都不做 - 好吧,操作系统会为你的程序清理一切.然后唯一的缺点是,如果有打开的写入流,某些数据可能不会写入磁盘.但也许在Ctrl + C的情况下它就可以了.