精华内容
下载资源
问答
  • windows下关闭进程树

    千次阅读 2018-12-11 09:55:00
    关闭进程树,需要遍历给定进程下的所有子进程,这个过程可以用并查集来做。  1、编写获取进程父进程的代码   #define ProcessBasicInformation 0 typedef struct { DWORD ExitStatus; DWORD ...

      关闭进程需要特定权限,如果你程序权限不够也会导致关闭进程失败。关闭进程树,需要遍历给定进程下的所有子进程,这个过程可以用并查集来做。

        1、编写获取进程父进程的代码

        

    #define ProcessBasicInformation 0  
    
    typedef struct  
    {  
        DWORD ExitStatus;  
        DWORD PebBaseAddress;  
        DWORD AffinityMask;  
        DWORD BasePriority;  
        ULONG UniqueProcessId;  
        ULONG InheritedFromUniqueProcessId;  
    }   PROCESS_BASIC_INFORMATION;  
    
    typedef LONG (__stdcall *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
    
    DWORD GetParentProcessID(DWORD dwProcessId)
    {
        LONG                        status;
        DWORD                        dwParentPID = (DWORD)-1;
        HANDLE                        hProcess;
        PROCESS_BASIC_INFORMATION    pbi;
    
        PROCNTQSIP NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(  
            GetModuleHandle("ntdll"), "NtQueryInformationProcess"); 
    
        if(NULL == NtQueryInformationProcess)
        {
            return (DWORD)-1;
        }
        // Get process handle
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE, dwProcessId);
        if (!hProcess)
        {
            return (DWORD)-1;
        }
    
        // Retrieve information
        status = NtQueryInformationProcess( hProcess,
            ProcessBasicInformation,
            (PVOID)&pbi,
            sizeof(PROCESS_BASIC_INFORMATION),
            NULL
            );
    
        // Copy parent Id on success
        if  (!status)
        {
            dwParentPID = pbi.InheritedFromUniqueProcessId;
        }
    
        CloseHandle (hProcess);
    
        return dwParentPID;
    
    }
    View Code

     

          2、并查集find的代码

        

    DWORD FindParentPID(std::map<DWORD,DWORD>& mapPPID,DWORD dwParentPID)
    {
        if(mapPPID.find(dwParentPID) == mapPPID.end() || mapPPID[dwParentPID]==dwParentPID)
            return dwParentPID;
        DWORD root = FindParentPID(mapPPID,mapPPID[dwParentPID]);
        mapPPID[dwParentPID] = root;
        return root;
    }

     

          3、通过进程id来结束进程树代码

      

    BOOL StopProcessTree(DWORD dwProcessID)
    {

        HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        PROCESSENTRY32 info;
        info.dwSize = sizeof(PROCESSENTRY32);
        Process32First(handle, &info);
        std::map<DWORD,DWORD> mapPID; //key为进程id,val为根进程id。
        while (Process32Next(handle, &info) != FALSE)
        {
          DWORD dwPPID= GetParentProcessID(info.th32ProcessID); //找直接上一级的父进程
          if(info.th32ProcessID == dwProcessID)
          {
            mapPID[dwProcessID] = dwProcessID;
          }
          else if(dwPPID != (DWORD)-1)
          {
            mapPID[info.th32ProcessID] = dwPPID;
          }
        }
        ::CloseHandle(handle);

     
      

        BOOL bRet = TRUE;
        //使用并查集原理优化查询特定进程的进程树效率。
        for(std::map<DWORD,DWORD>::iterator iter = mapPID.begin();iter != mapPID.end();iter++)
        {
          DWORD dwTempPID = iter->first;
          if(FindParentPID(mapPID,dwTempPID)==dwProcessID)
          {
            HANDLE hProcess= OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwTempPID);
            bRet = TerminateProcess(hProcess,0)?bRet:FALSE;
            ::CloseHandle(hProcess);
          }
        }

        return bRet;

    }

     

               4、通过进程名来结束进程树

    BOOL StopProcessByName(LPCTSTR pszProcessName)
    {
            HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
            PROCESSENTRY32 info; 
            info.dwSize = sizeof(PROCESSENTRY32); 
            Process32First(handle, &info); 
            BOOL bRet = TRUE;
            while (Process32Next(handle, &info) != FALSE) 
            {
                CString csProcessName = pszProcessName;
                CString csExeFile = info.szExeFile; 
                if(csExeFile.CompareNoCase(csProcessName)==0)
                {
                    StopProcessTree(info.th32ProcessID);
                    break;
                }
            }
            ::CloseHandle(handle);
            return bRet;
    }

     

    转载于:https://www.cnblogs.com/jlyg/p/10100597.html

    展开全文
  • C#关闭进程树

    2015-07-01 09:32:03
    Windows并不维护进程间的父子关系链,而是提供了另外一个妥协的办法 - Job对象。你可以自己维护相关的多个进程,或把多个进程放入一个Job对象中,...关闭一个进程树,与之所有相关的进程也被关闭了;通常,Windows task
    Windows并不维护进程间的父子关系链,而是提供了另外一个妥协的办法 - Job对象。你可以自己维护相关的多个进程,或把多个进程放入一个Job对象中,以便统一管理。Windows task manager中"End Process" & "End Process Tree"分别对应kill掉一个单独的进程和一个进程树。关闭一个进程树,与之所有相关的进程也被关闭了;通常,Windows task manager中关闭一个父进程,其子进程不会被关闭(Windows并不维护进程间的父子关系链)。
     
    分析进程的工具Process explorer:  http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
     
    可以通过以下代码来实现关闭一个进程树:
    [c-sharp]  view plain copy
    1. using System;  
    2. using System.Diagnostics;  
    3. using System.Globalization;  
    4. using System.Management;  
    5.   
    6. namespace xxx  
    7. {  
    8.     public static class ProcessesKiller  
    9.     {  
    10.         public static void FindAndKillProcess(int id)  
    11.         {  
    12.             killProcess(id);  
    13.         }  
    14.   
    15.         public static void FindAndKillProcess(string name)  
    16.         {  
    17.             foreach (Process clsProcess in Process.GetProcesses())  
    18.             {  
    19.                 if ((clsProcess.ProcessName.StartsWith(name, StringComparison.CurrentCulture)) || (clsProcess.MainWindowTitle.StartsWith(name, StringComparison.CurrentCulture)))  
    20.                     killProcess(clsProcess.Id);  
    21.             }  
    22.         }  
    23.   
    24.         private static bool killProcess(int pid)  
    25.         {  
    26.             Process[] procs = Process.GetProcesses();  
    27.             for (int i = 0; i < procs.Length; i++)  
    28.             {  
    29.                 if (getParentProcess(procs[i].Id) == pid)  
    30.                     killProcess(procs[i].Id);  
    31.             }  
    32.   
    33.             try  
    34.             {  
    35.                 Process myProc = Process.GetProcessById(pid);  
    36.                 myProc.Kill();  
    37.             }  
    38.             // process already quited  
    39.             catch (ArgumentException)  
    40.             {  
    41.                 ;  
    42.             }  
    43.   
    44.             return true;  
    45.         }  
    46.   
    47.         private static int getParentProcess(int Id)  
    48.         {  
    49.             int parentPid = 0;  
    50.             using (ManagementObject mo = new ManagementObject("win32_process.handle='" + Id.ToString(CultureInfo.InvariantCulture) + "'"))  
    51.             {  
    52.                 try  
    53.                 {  
    54.                     mo.Get();  
    55.                 }  
    56.                 catch (ManagementException)  
    57.                 {  
    58.                     return -1;  
    59.                 }  
    60.                 parentPid = Convert.ToInt32(mo["ParentProcessId"], CultureInfo.InvariantCulture);  
    61.             }  
    62.             return parentPid;  
    63.         }  
    64.     }  
    65. }  
    展开全文
  • 进程树的结构大概是这样的: A是父进程; B是A的子进程; B的下面可能有多个子进程C、D、E; B的子进程下面也有子进程F、G、H。。。 可能还有更多层的进程 [color=#0000FF]我们现在唯一可知道的是A和B的...
  • 进程和进程树

    千次阅读 2012-09-11 09:03:28
    一些程序进程运行后,会调用其他进程,这样就组成了一个进程树。 结束进程树 比如,在Windows XP的“运行”对话框中输入“cmd”启动命令行控制台,然后在命令行中输入“notepad”启动记事本。现在,命令行控制台...
    	一些程序进程运行后,会调用其他进程,这样就组成了一个进程树。
     
       结束进程树

    结束进程树

      比如,在Windows XP的“运行”对话框中输入“cmd”启动命令行控制台,然后在命令行中输入“notepad”启动记事本。现在,命令行控制台进程“cmd.exe”和记事本进程“notepad.exe”就组成了一个进程树,其中“notepad.exe”进程是由“cmd.exe”进程创建的,前者称为子进程,后者称为父进程。现在我们用组合键Ctrl+ Alt+ Del调出任务管理器,在“进程”页面中选择“cmd.exe”,右击鼠标并选择“结束进程树”命令(如图),这时你会发现记事本进程也被同时杀死了。如果在notepad.exe”进程上结束进程的话,“cmd.exe”进程则依旧运行。因此,结束进程树的特性就是在结束一个进程的同时结束由该进程直接或间接创建的子进程。
    
    
    	一些结束进程的方法:
    tasklist:显示当前系统所有进程命令
      
      :taskkill:关闭至少一个系统进程命令
      
      /pid 后面是系统的进程id 如先查到notepad.exe的id是2152,则格式为 taskkill /pid 2152
      
      多个时格式为 taskkill /pid 2152 /pid 1284
      
      /im 后面是系统的进程名 如要关闭notepad.exe,格式为taskkill /im notepad.exe,指定多个 时格式为taskkill /im notepad.exe /im iexplorer.exe .如果是要关闭所有的,则使用通配符*,即 askkill /im *.exe
      
      /T 后面是结合上两个命令实现,如taskkill /t /im notepad.exe或者taskkill /t /pid 2152 这个效果是提示后在使用者确定后关闭,有提示框.
      
      /F 后面也是结合/pid 和/im实现,如taskkill /F /im notepad.exe或者taskkill /F /pid 2152这个是没有提示框就强制关闭指定进程.
    展开全文
  • 结束进程”与“结束进程树”是用来结束一个或多个进程用的。 进程树也许你是头回听说,我这里想解释一下。所谓进程树实际上就是一组进程,而这一组进程(子进程)是由一个进程(父进程)创建的。当你选择“结束进程...

    结束进程”与“结束进程树”是用来结束一个或多个进程用的。
    进程树也许你是头回听说,我这里想解释一下。所谓进程树实际上就是一组进程,而这一组进程(子进程)是由一个进程(父进程)创建的。当你选择“结束进程树”的时候,会将这一组进程都全部结束掉。强烈推荐结束父进程的时候使用这个功能。这样才能保证进程释放所有资源,不出现僵进程(哇,什么是僵进程?坏了,越说越多了。大家只要知道这个概念就可以:子进程需要由父进程释放,当子进程运行结束,而父进程还没有来得及释放的等待过程中,子进程是处于僵进程状态。)。

    展开全文
  • 查看进程树 pstree 语法:pstree [选项] ,可以更加直观的来看进程信息 -p :显示进程的 PID -u :显示进程的所属用户 请你树状的形式显示进程的 pid pstree -p 请你树状的形式进程的用户 id ...
  • centos 查看进程树名称

    2020-05-28 13:57:17
    pstree -Uup 以结构显示进程结构
  • 结束进程树

    千次阅读 2012-12-26 09:51:43
    void KillProcessTree(DWORD dwProcessID) {  PROCESSENTRY32 info; info.dwSize = sizeof(PROCESSENTRY...//结束进程句柄 HANDLE hProcess = NULL; DWORD dwParentPID = 0; DWORD dwChildPID = 0; HANDLE hPro
  • 我有一个主程序A.exe,非常重要,需要确保运行...但是有个问题,如果用户打开任务管理器,以“关闭进程树”的方式可以同时关闭A.exe和B.exe。 请问,有什么办法可以阻止这种操作? 进程注入? 我用的VB6.0+WinXP
  • WIN通过进程树,批量杀死进程

    千次阅读 2014-08-20 17:03:26
    // 简单实现杀死进程树(一层树),即传入一个父进程ID。该ID等于当前父进程的父进程的就杀掉。 父进程1  +---------子进程1  +---------子进程2  +---------子进程3 父进程2  +-...
  • c++命令结束进程树

    千次阅读 2015-11-30 20:50:45
    // 停止当前进程及其子进程 // 枚举所有的进程  HANDLE hSnapshot;  hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 创建快照  if (INVALID_HANDLE_VALUE != hSnapshot)  {  ...
  • 3.关闭进程关闭线程、卸载模块、拷贝进程内存,查找进程模块; 4.创建进程调试DUMP; 5.扫描进程Ring3钩子; 6.内核驱动模块的查看,内核驱动模块的内存拷贝,卸载驱动内核模块; 7.常见内核钩子的查看和...
  • 如果指定了用户名,则显示根植于该用户拥有的进程的所有进程树。如果pstree被调用为pstree.x11,那么它将提示行尾的用户按RETURE,并且在这种情况发生之前不会返回。这对于在x终端中运行pstree非常有用。pstree通过...
  • 一、基本介绍 Linux中,每个执行的程序都称为一个进程。每一个进程都分配一个ID号 每个进程都可以以两种方式存在。前台与后台
  • 1.systemd系统初始化程序,系统开始的第一个进程,pid为12.systemctl 命令systemctl list-units ##列出当前系统服务的状态systemctl list-unit-files ##列出服务的开机状态systemctl status sshd ##查看指定服务...
  • C#下查找并杀死子进程(进程树)

    千次阅读 2015-07-01 09:18:45
    最近在WPF程序里面启动一个java编写的应用程序,因为java编写的程序运行的时候需要运行虚拟机,所以在关闭的时候要将程序和虚拟机一起kill才可以,但是如果没有办法找到java程序对应的虚拟机,将所有虚拟机都杀死的...
  • def killProcessTree(pid): rootProc=psutil.Process(pid) print("childProcess:"+str(rootProc.pid)+" "+str(rootProc.gids())) procs=rootProc.children() for proc in procs: ...
  • kill -信号 进程pid ####关闭进程
  • 可以关闭进程的VB源码,可以修改源码,可以变成定时关闭,或者其他什么东西,没法只能多写点字,凑字数,不然不让发。其实只要“可以关闭进程的VB源码”就够了
  • vmware-vmx.exe 右键关闭进程树 如果关闭不了 2、win10按住shift重启电脑,进入安全模式,找到VMware虚拟机安装目录,非vmware软件安装目录,比如我的D:\vmware\hadoop01 ,在安全模式下删除整个hadoop01文件夹,...
  • 如果指定了用户名,则显示根植于该用户拥有的进程的所有进程树。如果pstree被调用为pstree.x11,那么它将提示行尾的用户按RETURE,并且在这种情况发生之前不会返回。这对于在x终端中运行pstree非常有用。  pstree...
  • qt cmd 获取进程信息 关闭某个进程 打开某个进程 tasklist taskkill
  • 如何关闭进程

    千次阅读 2013-05-21 22:09:26
    当退出C#程序时,我在程序中结束杀掉了那个批处理文件的Process,但是,那个批处理所调用的子进程却无法像直接调用批处理文件那样随着批处理文件的进程一起被杀掉,而是自动向上提升成为了独立的进程。 在网上查了...
  • Linux中查看进程树 案例,启动的时候发现有2个frpc #查看进程信息 ps -elf | grep frpc 第一列是当前进程ID,第二列是父进程ID # -a 表示输出命令行选项 # p表PID # s表示指定进程的父进程 pstree -aps ...
  • 按指定的名称关闭相应进程 关键代码如下: For Each TName In NameS If mName LCase TName Then List1 AddItem TName pid my th32ProcessID pname mName Dim mProcID As Long mProcID OpenProcess 1& 1&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,504
精华内容 32,201
关键字:

关闭进程树