zoukankan      html  css  js  c++  java
  • TerminateJobObject是使用

    注意: AssignProcessToJobObject仅适用于win32 desktop app, 比如notepad是适用的,calculator是不适用的

    下面的demo是将notepad的句柄分配给作业,然后由TerminateJobObject统一kill

    #define _CRT_SECURE_NO_WARNINGS
    
    #include<iostream>
    #include<windows.h>
    using namespace std;
    
    bool ExecuteSoftware(HANDLE * hSoftwareJob, char * name, const int countExecute);
    void KillProcess(HANDLE hSoftwareJob);
    int main()
    {
        HANDLE notepadJob;
        const int SIZE_NOTE = 3;
        notepadJob = CreateJobObject(NULL, NULL);
        
        cout << "Execute WordPad
    ";
        if (!ExecuteSoftware(&notepadJob, const_cast<char*>("notepad.exe"), SIZE_NOTE))
        {
            cout << "Can't execute all process
    ";
            Sleep(1500);
        }
    
    
    
        cout << "Killing groups
    ";
    
        KillProcess(notepadJob);
    
    
        Sleep(2500);
    
        return 0;
    }
    
    bool ExecuteSoftware(HANDLE * hSoftwareJob, char * name, const int countExecute)
    {
        STARTUPINFO si;
        LPTSTR lpszSystemInfo;
        PROCESS_INFORMATION pi;
        TCHAR tchBuff[MAX_PATH + 1];
    
        lpszSystemInfo = tchBuff;
        GetSystemDirectory(lpszSystemInfo, MAX_PATH + 1);
        wsprintf(tchBuff, "%s\%s", lpszSystemInfo, name);
    
        ZeroMemory(&si, sizeof(si));
        si.cb = sizeof(si);
        ZeroMemory(&pi, sizeof(pi));
    
        for (int i = 0; i < countExecute; i++)
        {
            if (!CreateProcess(NULL, tchBuff, NULL, NULL, FALSE, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi)) //CREATE_BREAKAWAY_FROM_JOB是必需的
            {
                return false;
            }
            else
            {
                AssignProcessToJobObject(*hSoftwareJob, pi.hProcess);
                int err = GetLastError();
            }
        }
    
        return true;
    }
    
    
    void KillProcess(HANDLE hSoftwareJob)
    {
        TerminateJobObject(hSoftwareJob, 0);
        int err = GetLastError();
    }

    有意思的是如果使用openprocess获取计算器的句柄,然后将句柄传递给AssignProcessToJobObject,同样也可以被TerminateJobObject杀掉进程。 

    不过测试之后发现createprocess得到的processid与任务管理器中看到的pid不一样,也就是如果createprocess得到的Pid传给openprocess之后,获取的新句柄将无法使用。

  • 相关阅读:
    用纹理贴图模拟反射,NeHe23课球面映射相关
    VS2010: CommandLine Warning D9025
    【转】C RunTime Library 暨 深入理解编译选项的含义 01
    让Doxygen输出中文注释不乱码
    windows环境下memcache配置
    C#中英文字符长度截取
    apache 的工作原理
    pear包安装phpunit
    使用 libevent 和 libev 提高网络应用性能
    PHP发明人谈MVC和网站设计架构——貌似他不支持php用mvc
  • 原文地址:https://www.cnblogs.com/strive-sun/p/12408159.html
Copyright © 2011-2022 走看看