文档章节

win32程序中监测父进程是否退出的实现

U_C
 U_C
发布于 2015/11/20 15:48
字数 267
阅读 104
收藏 0

1、在main函数中开辟一个监测线程:

    HANDLE exit_thread;
    exit_thread = CreateThread(NULL, 0, run, NULL, 0, NULL);

2、在线程处理函数run中进行处理,如果父进程退出,则本程序也退出:

  基本步骤如下:

(1)先获取自己的进程ID,GetCurrentProcessID()

(2) 获取进程查询句柄,调用OpenProcess()带上PROCESS_QUERY_INFORMATION标志

(3)调用NtQueryInformationProcess()来查询进程信息

(4) 获取父进程句柄,还是调用OpenProcess()

(5) 启动一个线程去等待父进程退出,WaitForSingleObject(ParentHandle, INFINITE)大功告成,这样无论是父进程正常退出,还是异常终止,子进程都能被退出。

struct ProcessBasicInformation {
    LONG ExitStatus;
    PVOID PebBaseAddress;
    ULONG_PTR AffinityMask;
    LONG BasePriority;
    ULONG_PTR UniqueProcessId;
    ULONG_PTR InheritedFromUniqueProcessId;
};

typedef LONG(__stdcall *FPTR_NtQueryInformationProcess) (HANDLE, ULONG, PVOID, ULONG, PULONG);

unsigned long GetParentPid()
{
    ULONG_PTR ppid = 0;
    DWORD pid = GetCurrentProcessId();
    HANDLE hcurrent = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
    
    if (hcurrent)
    {
        FPTR_NtQueryInformationProcess NtQueryInformationProcess = (FPTR_NtQueryInformationProcess)GetProcAddress(GetModuleHandle("ntdll.dll"),
            "NtQueryInformationProcess");

        if (NtQueryInformationProcess != NULL)
        {
            ProcessBasicInformation pbi;
            if (NtQueryInformationProcess(hcurrent, 0, (void*)&pbi, sizeof(pbi), NULL) == 0)
            {
                ppid = pbi.InheritedFromUniqueProcessId;
            }
        }
        CloseHandle(hcurrent);
    }

    return ppid;
}

DWORD WINAPI run(LPVOID  lpparameter)
{
    ULONG_PTR pPid = GetParentPid();

    HANDLE pHandle = OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, pPid);

    if (WaitForSingleObject(pHandle, INFINITE) == WAIT_OBJECT_0)
    {
        exit(0);
    }
    return 0;
}

© 著作权归作者所有

U_C

U_C

粉丝 0
博文 36
码字总数 16044
作品 0
深圳
私信 提问
Windows进程间通信

参考文献1:http://blog.csdn.net/leftla/article/details/11564539 参考文献2:http://www.cppblog.com/TechLab/archive/2005/12/30/2272.aspx /////////////////////////////////////////......

曾劲松
2016/08/22
102
0
windows下进程间通信的手段有哪些?

作者:李志刚 纪玉波 程小茁 崔朝辉 摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求。编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程...

长平狐
2012/09/20
156
0
windows下进程间通信的方式

1 进程与进程通信   进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的一个...

技术小阿哥
2017/11/27
0
0
Python网络编程(基础总结、 入门经典)

Linux下文件类型: bcd -lsp b(块、设备文件) c(字符设备文件) d(目录) -(普通文件) l(链接文件) s(套接字文件) p(管道文件) kill -sig pid:通过pid发送信号杀死指定进程 ki...

ParisGabriel
2018/08/18
0
0
Linux下调用fork或system启动子进程的信号和资源释放相关问题

最近一段时间,公司的网管系统二期优化需要新增功能,实现对网管客户端程序进行保护的监控脚本的自动更新及保护进程的监控告警。网管客户端程序分为两部分:客户端GatherClient及保护进程gat...

鉴客
2011/10/25
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
6
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部