提问人:rxantos 提问时间:10/25/2023 更新时间:10/26/2023 访问量:128
如果进程停止,它会自动关闭其打开的文件句柄吗?
If a process stops, will it automatically close its opened file handles?
问:
假设进程打开一个文件句柄,然后进程停止。(例如,如果它崩溃了)。 打开的句柄会作系统自动关闭吗?
如果它们保持开放状态,有没有办法证明这一点。如果它们被自动关闭,有没有办法证明这一点?
答:
-1赞
klutt
10/25/2023
#1
首先。这与操作系统有关,与语言无关。因此,您必须参考您正在使用的特定操作系统。
但是,除了非常专业的操作系统之外,所有现代操作系统都会清理资源。Linux、Windows 和 MacOS 做到了。
如果它们保持开放状态,有没有办法证明这一点。
取决于。在 Windows 中,不允许删除打开的文件。因此,如果您无法删除在崩溃程序中打开的文件,这是很好的证据。
如果它们被自动关闭,有没有办法证明这一点?
那里一样,但相反。如果可以删除在崩溃程序中打开的文件,则该文件已关闭。在 Windows 中,就是这样。
评论
1赞
ikegami
10/25/2023
回复“在 Windows 中,不允许删除打开的文件”,这完全取决于打开句柄时传递的参数。这就是当你传递零时发生的情况。
0赞
David Heffernan
10/25/2023
被标记的问题 winapi 解决了第一段
0赞
rxantos
10/26/2023
#2
看完卡洛·阿里纳斯的建议。我制作了这个程序来测试它们是否关闭。
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;
}
事实上,该文件已创建,可以在崩溃后删除,但不能在崩溃之前删除。所以是的,窗户确实关闭了手柄。当然,您可能会丢失在崩溃时写入缓冲区的任何内容(尽管我还没有测试过它)
0赞
Seva Alekseyev
10/26/2023
#3
通常,当进程退出时,文件句柄(以及其他内核对象句柄)将关闭,但需要注意。相反行为的一个明显案例 - 如果句柄被创建为可继承的,并且相关进程已启动启用句柄继承的子进程,则该句柄肯定会比原始进程更长。这是有据可查的行为,而不是怪癖。
综上所述,不应将句柄生存期与基础对象生存期混淆。具体来说,文件是持久的,所以这不是问题,但对于内存中对象(例如互斥锁),对象生存期是一个比句柄生存期更相关的问题(具有更复杂的答案)。
评论