当前位置:首页 > c++ > 正文内容

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

xuwenyan6个月前 (09-20)c++446

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

需要使用的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
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/2855

    标签: 多进程
    分享给朋友:

    “c++实现windows主进程退出,子进程自动退出” 的相关文章

    C++如何实现窗口全屏显示

    C++如何实现窗口全屏显示

    窗口全屏,直接上代码:void FullScreen(HWND hwnd) {   //去掉所有边框,解决虚拟机win10任务栏显示问题   DWORD style = ::GetWindowLo...

    C++如何获取控制台程序的输出内容?

    C++如何获取控制台程序的输出内容?

    很多工具程序(如ffmpeg)的进度显示往往都是以控制台字符显示的方法,我们可能需要调用这种控制台工具去完成工作,但同时又希望以友好的ui界面去显示当前的工作状态(如进度)。此时我们能想到的就是运行控制台程序,然后以某种方式去获取到控制台程序的输出,然后转换到我们的ui界面上去显示。 有多种...

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    学习ffmpeg时遇到一个问题,ffmpeg解码出RGB颜色后怎么绘制到屏幕上,于是将GDI、MFC_GDI、GDI+等方式都记录一下 1:注意按windows的要求,R、G、B、A顺序要调整为B、G、R、A 。 2:GDI不支持透明通道A,透明通道A的值读进去以后没有作用。想要支持透...

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    例如,我用VC2015的工程向导新建一个ATL的工程名字叫myAtl,那么VC会同时给我生成一个叫做myAtlPS的工程。这个myAtlPS工程是做什么的?什么情况下可以不需要它?什么情况下它又是必须存在的? PS工程是什么?可以不要吗? 这个PS工程叫做代理与存根(proxy&nbs...

    ATL实现windows右键菜单扩展(ContextMenu)

    ATL实现windows右键菜单扩展(ContextMenu)

    右键菜单,即用户右击shell对象时弹出的上下文菜单(context menu)。本文记录了如何创建右键菜单的基本过程,跟着步骤一步一步来,即可创建出一个右键菜单工程。第一步,新建一个ATL工程Visual Studio—>新建项目—>ATL—>使用默认配置(一直按下一步即可)。注...

    uafxcwd.lib(afxmem.obj) : error LNK2005:

    uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法

    如果在编译MFC程序的时候出现下列及类似的错误: 1˃uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new...