我有两个程序,我们称之为prog-1.exe
和prog-2.exe
。 prog-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()
是否适用于我的目的?
是否还有其他函数/方法可以关闭从父进程继承的所有打开文件句柄?
答案 0 :(得分:1)
没有支持的枚举句柄的方法,因此关闭子进程中所有继承的句柄通常是不切实际的。 (原则上,您的主进程可以向子进程传递一个句柄列表以关闭,但如果主进程有这样的列表,则更容易在这些句柄上禁用继承。)
但是,如果使用CreateProcess
而不是system()
启动子流程,则可以通过将bInheritHandles
设置为FALSE
来禁用句柄继承。这是您遇到的最直接的解决方案。
或者,如果您只需要继承一个或多个特定句柄(例如,为了重定向标准输入或输出),您可以使用带有UpdateProcThreadAttributeList
的PROC_THREAD_ATTRIBUTE_HANDLE_LIST
和相关函数来指定你希望继承的句柄。通过传递STARTUPINFOEX
结构并在CreateProcess
参数中设置EXTENDED_STARTUPINFO_PRESENT
,可以将属性列表传递给dwCreationFlag
。