这是个我在C#调用批处理文件时遇到的问题。首先我通过Process.Start方法调用一个批处理文件,那个批处理文件里面则调用了一大堆程序。当退出C#程序时,我在程序中结束杀掉了那个批处理文件的Process,但是,那个批处理所调用的子进程却无法像直接调用批处理文件那样随着批处理文件的进程一起被杀掉,而是自动向上提升成为了独立的进程。

在网上查了一下,可以通过NtQueryInformationProcess函数查询子进程的信息,并同时也查到了一段杀掉进程及所有子进程的C#代码,有需要的朋友可以参考一下。

代码

static class ProcessExtend
    {
        // [StructLayout(LayoutKind.Sequential)]
        private struct ProcessBasicInformation
        {
            public int ExitStatus;
            public int PebBaseAddress;
            public int AffinityMask;
            public int BasePriority;
            public uint UniqueProcessId;
            public uint InheritedFromUniqueProcessId;
        }

[DllImport("ntdll.dll")]
        static extern int NtQueryInformationProcess(
           IntPtr hProcess,
           int processInformationClass /* 0 */,
           ref ProcessBasicInformation processBasicInformation,
           uint processInformationLength,
           out uint returnLength
        );

public static void KillProcessTree(this Process parent)
        {
            var processes = Process.GetProcesses();
            foreach (var p in processes)
            {
                var pbi = new ProcessBasicInformation();
                try
                {
                    uint bytesWritten;
                    if (NtQueryInformationProcess(p.Handle, 0, ref pbi, (uint)Marshal.SizeOf(pbi), out bytesWritten) == 0) // == 0 is OK
                        if (pbi.InheritedFromUniqueProcessId == parent.Id)
                            using (var newParent = Process.GetProcessById((int)pbi.UniqueProcessId))
                                newParent.KillProcessTree();
                }
                catch { }
            }
            parent.Kill();
        }
    }

PS:今天发现NtQueryInformationProcess函数在x64位程序上运行无效, 具体原因不明,Google了一下也没有找到答案,反而找到了另一种解决方案,通过WMI来实现的。在x86和x64下都可以使用。

View Code

static void KillProcessAndChildren(int pid)
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
    ManagementObjectCollection moc = searcher.Get();
    foreach (ManagementObject mo in moc)
    {
        KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
    }
    try
    {
        Process proc = Process.GetProcessById(pid);
        Console.WriteLine(pid);
        proc.Kill();
    }
    catch (ArgumentException)
    { 
        /* process already exited */
    }
}

转载于:https://www.cnblogs.com/TianFang/archive/2010/05/19/1739614.html

如何杀死进程及子进程相关推荐

  1. 【LeetCode - 582】杀死进程

    文章目录 1.题目描述 2.解题思路 3.解题代码 1.题目描述 2.解题思路   先把所有进程的子进程统计好存入一个 HashMap<Integer, List> 中,key 为进程编号 ...

  2. centos 杀死进程命令kill

    2019独角兽企业重金招聘Python工程师标准>>> Linux 系统中时刻运行着许多进程,如果能够合理地管理它们,则可以优化系统的性能.在Linux 系统中,有 5 种常见的进程 ...

  3. linux与windows查看占用端口的进程ID并杀死进程

    有时候tomcat出现端口被占用,需要查出进程ID并杀死进程. 1.查找占用端口的进程ID(windows与linux一样  8005也可以加上引号   grep可以用findstr替换) 6904就 ...

  4. 转]Linux杀死进程方法大全

    2019独角兽企业重金招聘Python工程师标准>>> 2010年2月24日 乌帮图 发表评论 阅读评论 杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志. 首先使用 ...

  5. 奇安信集团笔试题:二叉树的最近公共祖先(leetcode236),杀死进程(leetcode582)...

    1. 二叉树最近公共祖先 奇安信集团 2020校招 服务端开发-应用开发方向在线考试 编程题|20分2/2 寻祖问宗 时间限制:C/C++语言 1000MS:其他语言 3000MS 内存限制:C/C+ ...

  6. 主进程、子进程和守护进程

    理解 主进程main thread: 程序执行的入口,可以理解为常用的main 函数. 父进程parent thread: 对于子进程而言, 子进程的创造者,可有多个子进程. 任何进程都有父进程,追根 ...

  7. Win10杀死进程方式

    一.通过任务管理器 打开任务管理器 如下图,选中你要杀死的进程点击"结束" 二.通过命令杀死进程 在cmd中输入tasklist 2.1通过进程名 taskkill  /f  /i ...

  8. Centos杀死进程kill方法大全

    cheersli Centos杀死进程kill方法大全 杀死进程最安全的方法是单纯使用kill命令. 首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令: # kill -pid 注释: ...

  9. win10taskkill强行结束进程_Window 命令行(taskkill)强制杀死进程

    我们常常会遇到端口被占用的情况,但使用图形界面不太好找,因此考虑使用命令行强制杀死进程.Windos 自带的 taskkill 工具可以实现杀进程的功能.使用方式如下: C:\Users\Admini ...

最新文章

  1. 加法神经网络--AdderNet: DoWe Really Need Multiplications in Deep Learning?
  2. Silverlight 4正式版发布
  3. 成功解决AttributeError: module 'tensorflow.python.keras' has no attribute 'Model'
  4. java数字转字符串及字符串转数字
  5. 机器人学习--路径规划--A*算法实现
  6. java技术突破要点
  7. 鲁九的六人小聚:夏吕吕岳倪兴
  8. 【华为云技术分享】物体检测yolo3算法 学习笔记(1)
  9. AndroidStudio安卓原生开发_UI高级_自定义主题和样式---Android原生开发工作笔记129
  10. VIRT,RES,SHR,虚拟内存和物理内存(转)
  11. 华为机试HJ42:学英语
  12. 栈的应用(进制转换)
  13. 关于java加壳和代码混淆
  14. LabView实验——温度检测系统(实验学习版)
  15. html中五号字体是多少像素,5号字是多大(字体尺寸对照表mm)
  16. TCP的乱序和丢包判断(附Reordering更新算法)-实例case
  17. 点云上的深度学习及其在三维场景理解中的应用————PointNet(一)
  18. 动态规划-背包问题、兑换零钱问题、旅行商问题
  19. 支付宝app支付功能-服务端的实现-python3版
  20. (8)web安全|渗透测试|网络安全 常见的站点搭建类型分析,子域名爆破,旁注等,WAF防护分析及绕过,wafwoof工具的安装和使用

热门文章

  1. 逻辑回归模型(Logistic Regression, LR)基础
  2. OpenCV中使用神经网络 CvANN_MLP
  3. Python dataframe修改列顺序(pandas学习)
  4. 牛顿插值多项式(python实现)
  5. STM32F0库函数初始化系列:PWM输出
  6. 06. 用css实现三角形
  7. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
  8. mongodb 学习笔记 2 --- 修改器
  9. 团队开发软件特点介绍
  10. Objective-C学习笔记2013[NSString]字符串[可变字符串中,加用app减用delete]