如何关闭子进程中的所有打开文件句柄?

时间:2014-04-24 21:23:06

标签: c windows

我有两个程序,我们称之为prog-1.exeprog-2.exeprog-1.exe使用prog-2.exe启动system。我想在prog-2.exe中做的第一件事就是关闭它从prog-1.exe继承的所有打开文件句柄。这就是我的尝试:

启动prog-2.exe

的代码
static int closeFileHandles()
{
   // From http://msdn.microsoft.com/en-us/library/fxfsw25t.aspx
   // The _fcloseall function closes all open streams
   // except stdin, stdout, stderr
   return _fcloseall();
}

int main(int argc, char** argv)
{
   // First things first...
   // Close all the inherited file handles.
   closeFileHandles();

   // Continue with the rest of the program
}

prog-1.exe

中的代码
FILE* in = fopen(inputFile, "r");

// ....
// ....

// Start prog-2.exe
system("prog-2.exe"); // It's in my path.

// prog-2.exe starts another process that stays in background mode
// Call this server.exe.

// Close the file.
fclose(in);

问题

我想删除inputFile来自prog-1.exe的目录。我无法删除目录,因为server.exe具有inputFile的打开句柄(当我尝试在Windows资源管理器中删除目录时,此信息由Windows提供)。

问题

我没有正确使用_fcloseall()吗?

_fcloseall()是否适用于我的目的?

是否还有其他函数/方法可以关闭从父进程继承的所有打开文件句柄?

1 个答案:

答案 0 :(得分:1)

没有支持的枚举句柄的方法,因此关闭子进程中所有继承的句柄通常是不切实际的。 (原则上,您的主进程可以向子进程传递一个句柄列表以关闭,但如果主进程有这样的列表,则更容易在这些句柄上禁用继承。)

但是,如果使用CreateProcess而不是system()启动子流程,则可以通过将bInheritHandles设置为FALSE来禁用句柄继承。这是您遇到的最直接的解决方案。

或者,如果您只需要继承一个或多个特定句柄(例如,为了重定向标准输入或输出),您可以使用带有UpdateProcThreadAttributeListPROC_THREAD_ATTRIBUTE_HANDLE_LIST和相关函数来指定你希望继承的句柄。通过传递STARTUPINFOEX结构并在CreateProcess参数中设置EXTENDED_STARTUPINFO_PRESENT,可以将属性列表传递给dwCreationFlag