我有两个进程,A 和 B。在某个时候 A 创建 B。在创建 B 之后,如果 A 的进程树被杀死,我希望 B 仍然存在。
我正在使用 CreateProcess() 来创建 B,但我似乎找不到任何方法让它在没有它成为孩子的情况下创建进程。与 ShellExecuteEx() 相同,但我可能缺少一些标志。
有谁知道我可以用什么来做到这一点?
编辑:我忘了提到两个进程都需要另一个进程的句柄或进程 ID
我有两个进程,A 和 B。在某个时候 A 创建 B。在创建 B 之后,如果 A 的进程树被杀死,我希望 B 仍然存在。
我正在使用 CreateProcess() 来创建 B,但我似乎找不到任何方法让它在没有它成为孩子的情况下创建进程。与 ShellExecuteEx() 相同,但我可能缺少一些标志。
有谁知道我可以用什么来做到这一点?
编辑:我忘了提到两个进程都需要另一个进程的句柄或进程 ID
您可以在 createprocess API 中将参数 dwcreationflags 设置为 DETACHED_PROCESS。
你可以试试那个进程A创建进程C,这样创建进程B然后进程C就会立即结束(终止)。在进程 B 中,仅存在有关直接父进程(C 的进程 ID 未在运行)的信息,而不是有关进程 A 的信息。因此,“如果 A 的进程树被杀死”,则进程 B 可能会继续运行。
例如,您启动 Process Explorer(参见http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)然后启动 Total Commander。从 Total Commander 启动 cmd.exe。从 cmd.exe 启动 notepad.exe。然后在 cmd.exe 中键入“exit”。cmd.exe 终止后,您可以看到notepad.exe 将不再显示在Total Commander (totalcmd.exe) 下。在进程资源管理器中为 Total Commander (totalcmd.exe) 选择“终止进程树”后,您可以看到 notepad.exe 保持运行。
调用时kernel32!CreateProcess()
,您可以使用进程属性指定不同的父级。这是一个可以做到这一点的函数。
bool CreateProcessWithParent(DWORD parentId, PWSTR commandline) {
auto hProcess = ::OpenProcess(PROCESS_CREATE_PROCESS, FALSE, parentId);
if (!hProcess)
return false;
SIZE_T size;
//
// call InitializeProcThreadAttributeList twice
// first, get required size
//
::InitializeProcThreadAttributeList(nullptr, 1, 0, &size);
//
// now allocate a buffer with the required size and call again
//
auto buffer = std::make_unique<BYTE[]>(size);
auto attributes = reinterpret_cast<PPROC_THREAD_ATTRIBUTE_LIST>(buffer.get());
::InitializeProcThreadAttributeList(attributes, 1, 0, &size);
//
// add the parent attribute
//
::UpdateProcThreadAttribute(attributes, 0,
PROC_THREAD_ATTRIBUTE_PARENT_PROCESS,
&hProcess, sizeof(hProcess), nullptr, nullptr);
STARTUPINFOEX si = { sizeof(si) };
//
// set the attribute list
//
si.lpAttributeList = attributes;
PROCESS_INFORMATION pi;
//
// create the process
//
BOOL created = ::CreateProcess(nullptr, commandline, nullptr, nullptr,
FALSE, EXTENDED_STARTUPINFO_PRESENT, nullptr, nullptr,
(STARTUPINFO*)&si, &pi);
//
// cleanup
//
::CloseHandle(hProcess);
::DeleteProcThreadAttributeList(attributes);
return created;
}
源代码取自https://scorpiosoftware.net/2021/01/10/parent-process-vs-creator-process/