4

AとBの2つのプロセスがあります。ある時点で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を参照)、TotalCommanderを起動します。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 に答える