C语言 如果一个进程停止,它会自动关闭它打开的文件句柄吗?

dzhpxtsq  于 2023-11-16  发布在  其他
关注(0)|答案(3)|浏览(299)

假设进程打开一个文件句柄,然后进程停止。(例如,如果它崩溃)。打开的句柄会被操作系统自动关闭吗?
如果它们保持打开状态,是否有办法证明这一点;如果它们自动关闭,是否有办法证明这一点?

wgeznvg7

wgeznvg71#

在阅读了阿里纳斯的建议后,我做了这个程序来测试它们是否关闭。

  1. define WIN32_LEAN_AND_MEAN
  2. #include <windows.h>
  3. #include <stdio.h>
  4. int main() {
  5. HANDLE file = CreateFileA("test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  6. if(file == INVALID_HANDLE_VALUE) {
  7. return 1;
  8. }
  9. printf("Opened the file. Test if you can delete it. then press enter");
  10. getchar();
  11. printf("Now will crash. Try to delete the file.\n");
  12. fflush(stdout);
  13. // Cause crash
  14. *(int*)0 = 0;
  15. CloseHandle(file);
  16. printf("Success!\n");
  17. return 0;
  18. }

字符串
确实,文件是创建的,可以在崩溃后删除,但不能在崩溃前删除。所以,是的,windows确实关闭了句柄。当然,你可能会在崩溃时丢失任何写入缓冲区的内容(尽管我没有测试它)。

展开查看全部
798qvoo8

798qvoo82#

一般来说,当进程退出时,文件句柄(以及其他内核对象句柄)将被关闭,但需要注意的是,一个明显的相反行为的情况-如果句柄被创建为可继承的,并且正在讨论的进程已经启动了一个启用句柄继承的子进程,那么句柄肯定会比原始进程更长寿。
尽管如此,我们不应该混淆句柄生命周期和底层对象生命周期。特别是文件是持久的,所以这不是问题,但是对于内存中的对象(例如互斥锁),对象生命周期是一个比句柄生命周期更相关的问题(有一个更复杂的答案)。

4sup72z8

4sup72z83#

首先。这是操作系统相关的,而不是语言相关的。所以你必须参考你使用的特定操作系统。
但所有现代操作系统都清理资源,除了非常专业的操作系统。Linux,Windows和MacOS都这样做。
如果他们仍然开放,有没有办法证明这一点。
看情况而定。在Windows中,你不能删除打开的文件。所以如果你不能删除你在崩溃的程序中打开的文件,这是一个很好的证据。
如果它们是自动关闭的,有办法证明吗?
同样,但相反。如果你可以删除你在崩溃的程序中打开的文件,那么它就关闭了。在Windows中,就是这样。

相关问题