在 Windows (MinGW) 中,我的程序从调用进程继承了不需要的句柄。
该进程不需要打开这些文件,但因为它的存在时间超出了父进程的生命周期,所以我遇到了文件保持打开状态的常见问题。
在 Linux 上我解决这个问题是这样的:
// Close all file descriptors
// It's hard to figure out how many are open, but the first 1000 should do
int fd;
for (fd = 0; fd < 1000; fd++)
close (fd);
这似乎在 Windows 中不起作用。
如何确定哪些文件句柄已被继承?我怎样才能关闭它们?
该项目是使用 MinGW 和 Windows 的 Unix 兼容性 API 用 C(非 C++)编写的。
最佳答案
我现在对此进行了一些调查,并且找到了真正问题的解决方案,但不是我想要的方式。
我原以为我能够找到并清理任何不需要的打开文件,但事实证明这很难。我找到了一些不同的教程( here 和 here )如何执行此操作,但它们依赖于未记录的 API。我无法让这项技术发挥作用——可能是我做错了,或者 Windows Server 2012 中的 API 可能发生了变化——但无论如何,我不确定我是否想要这样做; Sysinternals 可以跟踪这些内容并保持 Process Explorer 正常工作,但我不希望我的项目承担这种维护负担。
我现在有两个选择:
在父(调用)进程中放入一些特殊情况的代码,使其在适当的情况下调用
CreateProcess
并禁用继承(它当前使用_spawnlp
因为它是与 Unix 风格的管道和文件句柄兼容,并且您不能非常可靠地使用CreateProcess
)。让进程立即使用
CreateProcess
调用自身,然后退出(或无限期等待)以杀死任何不需要的句柄。
第一个感觉更有效率。第二个更灵活(它允许进程自行选择)。
我想我会选择选项一,因为就我目前的需求而言,它感觉是最不糟糕的。
关于c - 查找 Windows 程序中打开的句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18768296/