开始一个过程,而不是像孩子一样
Posted
技术标签:
【中文标题】开始一个过程,而不是像孩子一样【英文标题】:Start a process not as a child 【发布时间】:2015-04-27 15:10:03 【问题描述】:我需要启动一个进程并将其作为一个分离的进程运行。我有某种启动应用程序,其目的是运行另一个 exe 并立即退出。实现这一目标的最佳方法是什么?
我多次阅读CreateProcess
文档,但仍有疑问。文档说我需要在完成后致电CloseHandle
。但是我的父应用程序不应该等待孩子退出。文档的另一部分说我可以不理会句柄 - 当父进程终止时系统将关闭它们。这是否意味着子应用程序在父应用程序之后立即退出?这似乎不是真的 - 我关闭了一个启动器,但我的子进程仍在运行。
有一个 DETACHED_PROCESS
标志似乎是我正在寻找的。但是文档说明了有关控制台的内容。什么控制台?我不在乎控制台。
【问题讨论】:
在进程句柄上调用CloseHandle
不会终止进程。它只是关闭进程对象的句柄。进程对象仍然存在,并将继续前进。因此,请致电CreateProcess
,然后终止您的启动器进程。如果您愿意,请在两个手柄上致电 CloseHandle
。或者不,系统会为你整理。
【参考方案1】:
DETACHED_PROCESS flag documentation 状态
对于控制台进程,新进程不会继承其父控制台(默认)
这意味着:如果您有一个控制台进程并启动一个新进程,它将不会继承其父控制台。
如果您没有控制台进程,则不必担心。
CreateProcess 创建一个子进程,但不等待子进程完成,所以你已经准备好了。
如果您想等待子进程完成,您应该调用CreateProcess
,然后调用WaitForSingleObject
总结一下:
// Version 1) Launch and wait for a child process completion
STARTUPINFO info = sizeof(info) ;
PROCESS_INFORMATION processInfo;
if (CreateProcess(L"C:\\myapp.exe", L"", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
::WaitForSingleObject(processInfo.hProcess, INFINITE); // DO WAIT for the child to exit
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
// ----------------------------------------------------------------
// Version 2) Launch and do NOT wait for a child process completion
STARTUPINFO info = sizeof(info) ;
PROCESS_INFORMATION processInfo;
if (CreateProcess(L"C:\\myapp.exe", L"", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
CloseHandle(processInfo.hProcess); // Cleanup since you don't need this
CloseHandle(processInfo.hThread); // Cleanup since you don't need this
请注意,第 2 版将不会终止您的子进程。只有不再需要的资源才会被释放。
【讨论】:
哦,我认为关闭句柄意味着关闭应用程序......如果启动器退出但子进程将写入它的控制台(假设我们没有指定标志)怎么办?我正在使用 gui 应用程序作为孩子,所以我无法检查。 @nikitablacka win32 应用程序不会使用控制台子系统。在那种情况下也没有问题。【参考方案2】:我多次阅读 CreateProcess 文档,但仍有疑问。文档说我需要在完成后调用 CloseHandle。但我的父应用不应该等待孩子退出。
好的,那就别等了。您可以立即在父级中调用CloseHandle
。
文档的另一部分说我可以不理会句柄 - 当父进程终止时系统将关闭它们。这是否意味着子应用程序在父应用程序之后立即退出?这似乎不是真的 - 我关闭了一个启动器,但我的子进程仍在运行。
不,它没有。我不确定你是如何从文档中得到的,但这不是它的意思。
有一个 DETACHED_PROCESS 标志似乎是我正在寻找的。但是文档说明了有关控制台的内容。什么控制台?我不在乎控制台。
如果你不在乎,那就别担心。
【讨论】:
以上是关于开始一个过程,而不是像孩子一样的主要内容,如果未能解决你的问题,请参考以下文章