c++实现windows主进程退出,子进程自动退出
多进程开发时,实现当主进程意外退出(如崩溃,被强杀等)时,实现子进程自动退出
需要使用的api
// 创建作业对象
HANDLE CreateJobObject(
[in, optional] LPSECURITY_ATTRIBUTES lpJobAttributes,
[in, optional] LPCSTR lpName
);
// 把进程加入作业。
BOOL AssignProcessToJobObject(
[in] HANDLE hJob,
[in] HANDLE hProcess
);
// 设置作业的限制内容
BOOL SetInformationJobObject(
[in] HANDLE hJob,
[in] JOBOBJECTINFOCLASS JobObjectInformationClass,
[in] LPVOID lpJobObjectInformation,
[in] DWORD cbJobObjectInformationLength
);
demo代码
// test_multi_process.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <windows.h> #include <tchar.h> #include <processthreadsapi.h> int main(int argc, char** argv) { if (argc > 1) { std::cout << "我是子进程:" << ::GetCurrentProcessId() << std::endl; system("pause"); } else { std::cout << "我是主进程:" << ::GetCurrentProcessId() << std::endl; HANDLE job_handle = ::CreateJobObject(nullptr, nullptr); wchar_t szPath[MAX_PATH] = { 0 }; ::GetModuleFileName(nullptr, szPath, MAX_PATH); swprintf_s(szPath, _T("%s --subprocess"), szPath); // 启动两个子进程 for (int i = 0; i < 2; ++i) { STARTUPINFO startup_info; memset(&startup_info, 0x0, sizeof(startup_info)); startup_info.cb = sizeof(startup_info); startup_info.wShowWindow = SW_SHOW; PROCESS_INFORMATION proc_info; memset(&proc_info, 0x0, sizeof(proc_info)); if (::CreateProcess(nullptr, szPath, nullptr, nullptr, FALSE, CREATE_NEW_CONSOLE, nullptr, nullptr, &startup_info, &proc_info)) { ::AssignProcessToJobObject(job_handle, proc_info.hProcess); ::CloseHandle(proc_info.hThread); ::CloseHandle(proc_info.hProcess); } } // 设置Job对象回收,自动退出所有子进程 JOBOBJECT_EXTENDED_LIMIT_INFORMATION limit_info; ZeroMemory(&limit_info, sizeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION)); limit_info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; ::SetInformationJobObject(job_handle, JobObjectExtendedLimitInformation, &limit_info, sizeof(limit_info)); system("pause"); /* * 释放job对象,调用后,所有相关进程都会退出。 * 假如程序崩溃没调用释放,由系统回收,也能达到结束所有相关进程的效果。 */ ::CloseHandle(job_handle); } return 0; }