gpt4 book ai didi

c++ - 开始一个进程而不是 child

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:22 25 4
gpt4 key购买 nike

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

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

DETACHED_PROCESS 标志似乎是我要找的东西。但是文档说明了一些关于控制台的内容。什么控制台?我不关心控制台。

最佳答案

DETACHED_PROCESS flag documentation

For console processes, the new process does not inherit its parent's console (the default)

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

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

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

关于c++ - 开始一个进程而不是 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29899461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com