c - 查找 Windows 程序中打开的句柄

标签 c windows mingw

在 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++)编写的。

最佳答案

我现在对此进行了一些调查,并且找到了真正问题的解决方案,但不是我想要的方式。

我原以为我能够找到并清理任何不需要的打开文件,但事实证明这很难。我找到了一些不同的教程( herehere )如何执行此操作,但它们依赖于未记录的 API。我无法让这项技术发挥作用——可能是我做错了,或者 Windows Server 2012 中的 API 可能发生了变化——但无论如何,我不确定我是否想要这样做; Sysinternals 可以跟踪这些内容并保持 Process Explorer 正常工作,但我不希望我的项目承担这种维护负担。

我现在有两个选择:

  1. 在父(调用)进程中放入一些特殊情况的代码,使其在适当的情况下调用 CreateProcess 并禁用继承(它当前使用 _spawnlp 因为它是与 Unix 风格的管道和文件句柄兼容,并且您不能非常可靠地使用 CreateProcess )。

  2. 让进程立即使用 CreateProcess 调用自身,然后退出(或无限期等待)以杀死任何不需要的句柄。

第一个感觉更有效率。第二个更灵活(它允许进程自行选择)。

我想我会选择选项一,因为就我目前的需求而言,它感觉是最不糟糕的。

关于c - 查找 Windows 程序中打开的句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18768296/

相关文章:

windows - 如何将存储在 utf-8 中的批处理文件转换为可通过另一个批处理文件运行的文件并运行它

c++ - std::stoi 在 MinGW 上的 g++ 4.6.1 中不存在

python - 使用 mingw 捕获 distutils 的错误输出

c - 为什么这个 C 函数(求 n 的平方根的牛顿拉夫逊法)不能正常工作?

c - 该命令在 C 中有效吗?

c - ls命令如何找到硬链接(hard link)数?

c# - 如何获取正在运行的 HTML Windows 8 应用程序的名称(不是 WWHOST)

python - 私有(private) Unicode 字符在 Python 3 解释器中显示不同

C++ VS17 给出与 Linux 子系统中相同代码不同的输出

c - C语言中如何将字符串转换为整数?