开始一个过程,而不是作为一个孩子

Start a process not as a child

本文关键字:一个 孩子 过程 开始      更新时间:2023-10-16

我需要启动一个进程并将其作为分离的进程运行。我有某种入门应用程序,其目的是运行另一个exe并立即退出。实现这一目标的最佳方法是什么?

我多次阅读CreateProcess文档,但仍然有疑问。文档说我需要在完成后致电CloseHandle。但是我的父应用程序不应该等待孩子退出。文档的另一部分说我可以不理会句柄 - 当父进程终止时,系统将关闭它们。这是否意味着子应用程序在父应用程序之后立即退出?这似乎不是真的 - 我关闭了一个启动器,但我的子进程仍在运行。

有一个DETACHED_PROCESS标志似乎是我正在寻找的。但是文档说明了控制台。什么控制台?我不在乎控制台。

DETACHED_PROCESS标志文档状态

对于控制台进程

新进程不会继承其父进程的控制台(默认值)

这意味着:如果您有一个控制台进程并启动一个新进程,它将不会继承其父进程的控制台。

如果您没有控制台进程,则不必担心。

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 不会终止子进程。只会释放不再需要的资源。

我多次阅读了CreateProcess文档,但仍然有疑问。文档说我需要在完成后调用 CloseHandle。但是我的父应用程序不应该等待孩子退出。

好吧,那就不要等待了。您可以立即在家长中呼叫CloseHandle

文档的另一部分说我可以不理会句柄 - 当父进程终止时,系统将关闭它们。这是否意味着子应用程序在父应用程序之后立即退出?这似乎不是真的 - 我关闭了一个启动器,但我的子进程仍在运行。

不,它没有。我不确定您是如何从文档中得到的,但这不是它的意思。

有一个DETACHED_PROCESS标志似乎是我正在寻找的。但是文档说明了控制台。什么控制台?我不在乎控制台。

如果你不在乎,那就不用担心了。