C++ C++;-当终止初始进程时,不会终止从另一进程启动的进程

C++ C++;-当终止初始进程时,不会终止从另一进程启动的进程,c++,windows,winapi,process,createprocess,C++,Windows,Winapi,Process,Createprocess,我有一个问题,当父进程被类似于“kill task”的东西杀死时,在另一个进程内部创建的进程被留下。更准确地说,应用程序将启动general_service.exe。在这项服务中,我启动了一个新的logger_runner.exe。当主应用程序停止时,它只会杀死general_service.exe,但在任务管理器中,我会看到我的记录器_runner.exe。当我在VS中停止general_service.exe时,它也会被保留。 如何让我的跑步者依靠一般服务 谢谢你的帮助 此函数用于启动my.

我有一个问题,当父进程被类似于“kill task”的东西杀死时,在另一个进程内部创建的进程被留下。更准确地说,应用程序将启动general_service.exe。在这项服务中,我启动了一个新的logger_runner.exe。当主应用程序停止时,它只会杀死general_service.exe,但在任务管理器中,我会看到我的记录器_runner.exe。当我在VS中停止general_service.exe时,它也会被保留。 如何让我的跑步者依靠一般服务

谢谢你的帮助

此函数用于启动my.exe

void startLogger(PROCESS_INFORMATION & processInformation) {
    std::wstring commandLine = L"\"" + PathUtils::programFolder() + LR"(\logger_runner.exe)" + L"\"";

    STARTUPINFOW startupInfo;

    memset(&startupInfo, 0, sizeof(startupInfo));
    memset(&processInformation, 0, sizeof(processInformation));

    wchar_t* commandLineCopy = _wcsdup(commandLine.c_str());

    if (!CreateProcessW(NULL,           // No module name (use command line)
       commandLineCopy,                // Command line
       NULL,                           // Process handle not inheritable
       NULL,                           // Thread handle not inheritable
       TRUE,                          // Set handle inheritance to FALSE
       0,                              // No creation flags
       NULL,                           // Use parent's environment block
       NULL,                           // Use parent's starting directory 
       &startupInfo,                   // Pointer to STARTUPINFO structure
       &processInformation)            // Pointer to PROCESS_INFORMATION structure
    )
   {
       free(commandLineCopy);
       throw SystemException();
   }

   free(commandLineCopy);
}

此函数应结束logger_runner.exe

void closeLogger(PROCESS_INFORMATION & processInformation) {
    // Check exit code
    DWORD exitCode = 0;
    GetExitCodeProcess(processInformation.hProcess, &exitCode);

    if (TerminateProcess(processInformation.hProcess, 0) == 0) {
        std::cerr << "Could not terminate logger process\n";
    }

    // Close process and thread handles. 
    CloseHandle(processInformation.hProcess);
    CloseHandle(processInformation.hThread);
}
在我的通用服务解决方案的主要功能中,我只需调用

LoggerWrapper logger

子进程独立于父进程。当杀死父进程时,它不会死。当然,您可以在作业对象内执行进程并杀死作业中的所有进程,但并不认为这是一个好的解决方案—杀死进程。每个流程都必须纠正可能相关的问题:同意@BillLumbert:请指出这个问题和这个问题之间是否有任何区别。如果我们想终止所有进程树,确实需要调用
TerminateJobObject
而不是设置
JOB\u OBJECT\u LIMIT\u KILL\u ON\u JOB\u CLOSE
LIMIT。无论如何,这不是个好主意。或者在
TerminateProcess
之前调用什么意义?
LoggerWrapper logger