当前位置:首页 > c++ > c++实现windows主进程退出,子进程自动退出

c++实现windows主进程退出,子进程自动退出

xuwenyan5天前c++340

多进程开发时,实现当主进程意外退出(如崩溃,被强杀等)时,实现子进程自动退出

需要使用的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;
}


    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。
    标签: 多进程

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法和观点。