4

我有两个进程,A 和 B。在某个时候 A 创建 B。在创建 B 之后,如果 A 的进程被杀死,我希望 B 仍然存在。

我正在使用 CreateProcess() 来创建 B,但我似乎找不到任何方法让它在没有它成为孩子的情况下创建进程。与 ShellExecuteEx() 相同,但我可能缺少一些标志。

有谁知道我可以用什么来做到这一点?

编辑:我忘了提到两个进程都需要另一个进程的句柄或进程 ID

4

3 回答 3

2

您可以在 createprocess API 中将参数 dwcreationflags 设置为 DETACHED_PROCESS。

于 2010-07-23T05:52:28.023 回答
1

你可以试试那个进程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 保持运行。

于 2010-06-28T21:30:15.713 回答
0

调用时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/

于 2022-02-03T11:11:46.547 回答