假设进程打开一个文件句柄,然后进程停止。(例如,如果它崩溃)。打开的句柄会被操作系统自动关闭吗?如果它们保持打开状态,是否有办法证明这一点;如果它们自动关闭,是否有办法证明这一点?
wgeznvg71#
在阅读了阿里纳斯的建议后,我做了这个程序来测试它们是否关闭。
define WIN32_LEAN_AND_MEAN#include <windows.h>#include <stdio.h>int main() { HANDLE file = CreateFileA("test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(file == INVALID_HANDLE_VALUE) { return 1; } printf("Opened the file. Test if you can delete it. then press enter"); getchar(); printf("Now will crash. Try to delete the file.\n"); fflush(stdout); // Cause crash *(int*)0 = 0; CloseHandle(file); printf("Success!\n"); return 0;}
define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
int main() {
HANDLE file = CreateFileA("test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(file == INVALID_HANDLE_VALUE) {
return 1;
}
printf("Opened the file. Test if you can delete it. then press enter");
getchar();
printf("Now will crash. Try to delete the file.\n");
fflush(stdout);
// Cause crash
*(int*)0 = 0;
CloseHandle(file);
printf("Success!\n");
return 0;
字符串确实,文件是创建的,可以在崩溃后删除,但不能在崩溃前删除。所以,是的,windows确实关闭了句柄。当然,你可能会在崩溃时丢失任何写入缓冲区的内容(尽管我没有测试它)。
798qvoo82#
一般来说,当进程退出时,文件句柄(以及其他内核对象句柄)将被关闭,但需要注意的是,一个明显的相反行为的情况-如果句柄被创建为可继承的,并且正在讨论的进程已经启动了一个启用句柄继承的子进程,那么句柄肯定会比原始进程更长寿。尽管如此,我们不应该混淆句柄生命周期和底层对象生命周期。特别是文件是持久的,所以这不是问题,但是对于内存中的对象(例如互斥锁),对象生命周期是一个比句柄生命周期更相关的问题(有一个更复杂的答案)。
4sup72z83#
首先。这是操作系统相关的,而不是语言相关的。所以你必须参考你使用的特定操作系统。但所有现代操作系统都清理资源,除了非常专业的操作系统。Linux,Windows和MacOS都这样做。如果他们仍然开放,有没有办法证明这一点。看情况而定。在Windows中,你不能删除打开的文件。所以如果你不能删除你在崩溃的程序中打开的文件,这是一个很好的证据。如果它们是自动关闭的,有办法证明吗?同样,但相反。如果你可以删除你在崩溃的程序中打开的文件,那么它就关闭了。在Windows中,就是这样。
3条答案
按热度按时间wgeznvg71#
在阅读了阿里纳斯的建议后,我做了这个程序来测试它们是否关闭。
字符串
确实,文件是创建的,可以在崩溃后删除,但不能在崩溃前删除。所以,是的,windows确实关闭了句柄。当然,你可能会在崩溃时丢失任何写入缓冲区的内容(尽管我没有测试它)。
798qvoo82#
一般来说,当进程退出时,文件句柄(以及其他内核对象句柄)将被关闭,但需要注意的是,一个明显的相反行为的情况-如果句柄被创建为可继承的,并且正在讨论的进程已经启动了一个启用句柄继承的子进程,那么句柄肯定会比原始进程更长寿。
尽管如此,我们不应该混淆句柄生命周期和底层对象生命周期。特别是文件是持久的,所以这不是问题,但是对于内存中的对象(例如互斥锁),对象生命周期是一个比句柄生命周期更相关的问题(有一个更复杂的答案)。
4sup72z83#
首先。这是操作系统相关的,而不是语言相关的。所以你必须参考你使用的特定操作系统。
但所有现代操作系统都清理资源,除了非常专业的操作系统。Linux,Windows和MacOS都这样做。
如果他们仍然开放,有没有办法证明这一点。
看情况而定。在Windows中,你不能删除打开的文件。所以如果你不能删除你在崩溃的程序中打开的文件,这是一个很好的证据。
如果它们是自动关闭的,有办法证明吗?
同样,但相反。如果你可以删除你在崩溃的程序中打开的文件,那么它就关闭了。在Windows中,就是这样。