如果进程停止,它会自动关闭其打开的文件句柄吗?

If a process stops, will it automatically close its opened file handles?

提问人:rxantos 提问时间:10/25/2023 更新时间:10/26/2023 访问量:128

问:

假设进程打开一个文件句柄,然后进程停止。(例如,如果它崩溃了)。 打开的句柄会作系统自动关闭吗?

如果它们保持开放状态,有没有办法证明这一点。如果它们被自动关闭,有没有办法证明这一点?

c winapi

评论

2赞 jarmod 10/25/2023
哪个操作系统?窗户11?
1赞 RbMm 10/25/2023
当然,Windows 会自动关闭所有用户模式打开的句柄。如果操作系统不这样做 - 将是巨大的手柄和其他资源泄漏
1赞 klutt 10/25/2023
当你在问题“作系统关闭”中写到自己时,这不是特定于语言的,而是特定于操作系统的。
1赞 Carlo Arenas 10/25/2023
“证明这一点”的最好方法是“滥用”Windows 不允许您删除打开的文件这一事实,因此在第一个进程崩溃后运行第二个进程。
3赞 Jonathan Leffler 10/25/2023
有些操作系统无法恢复崩溃程序使用的资源——最初的 AmigaOS 就是这样一种,IIRC,在理论被很好地理解之前,早期系统中可能还有其他例子。由于软件行为不端,此类系统容易耗尽资源,不能被视为可靠。现代操作系统在程序退出时(无论是否受控)在进程(释放内存和文件句柄等)之后进行清理。

答:

-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

通常,当进程退出时,文件句柄(以及其他内核对象句柄)将关闭,但需要注意。相反行为的一个明显案例 - 如果句柄被创建为可继承的,并且相关进程已启动启用句柄继承的子进程,则该句柄肯定会比原始进程更长。这是有据可查的行为,而不是怪癖。

综上所述,不应将句柄生存期与基础对象生存期混淆。具体来说,文件是持久的,所以这不是问题,但对于内存中对象(例如互斥锁),对象生存期是一个比句柄生存期更相关的问题(具有更复杂的答案)。