场景: 用VS创建一个c++项目时候,通常生成一个.exe程序,而.exe程序可能生成更多进程。如果用户希望提前停止构建进程,则VS必须想法终止.exe及所有子进程。
一,作业
Windows提供了一个作业(job)内核对象,它允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么。最好将作业对象想象成一个进程容器。但是创建只包含一个进程的作业同样非常有用,因为这样可以对进程施加平时不能施加的限制。
1) 验证当前进程是否在一个现有的作业控制之下:
BOOL IsProcessInJob(
HANDLE hProcess,
HANDLE hJob,
PBOOL pbInJob);
使用:IsProcessInJob(GetCurrentProcess(),NULL,&bInJob);
如果bInJob==True 则在当前作业控制之下
2)如果进程已与一个作业关联,就无法将当前进程或者它的任何子进程从作业中去除。这个安全特性可以确保进程无法摆脱对它施加的限制。然后,通过以下调用来创建一个新的作业内核对象:
HANDLE CreateJobObject(
PSECURITY_ATTRIBUTES psa,
PCTSTR pszName);
最后一个参数对此作业对象进行命名,使其能够由另一个进程通过OpenJobObject函数进行访问,如下所示:
3) 访问
HANDLE OpenJobObject(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
PCTSTR pszName);
示例:
HANDLE hJob=CreateJobObject(NULL,TEXT("tian")); //Create a named job object
AssignProcessToJobObject(hJob,GetCurrentProcess()); //put our own process in job
CloseHandle(hJob); //close the job
hJob=OpenJobObject(JOB_OBJECT_ALL_ACCESS,FALSE,TEXT("tian")); //open the exitint job
二,对作业中的进程施加限制
创建好一个作业之后,接着一般会根据作业中的进程能够执行哪些操作来建立一个沙箱(即施加限制)。可以向作业应用以下几种类型的限制:
- 基本限额和扩展基本限额,用于防止作业中的进程独占系统资源;
- 基本UI限制,用于防止作业内的进程更改用户界面;
- 安全限额,用于防止作业内的进程访问安全资源(文件。注册表子项等);
可以通过以下函数向作业施加限制:
BOOL SetInformationJobObject(
HANDLE hJob, //要限制的作业
JOBOBJECTINFOCLASS JobObjectInformationClass, //枚举类型,制定要施加到限制类型
PVOID pJobObjectInformation,// 数据结构地址,具体到限制设置
DWORD cbJobObjectInformationSize);//数据结构大小
限制类型
第二个参数的值
第三个参数所对应的数据结构(struct)
基本限额
|
JobObjectBasicLimitInformation
|
JOBOBJECT_BASIC_LIMIT_INFORMATION
|
扩展后的基本限额
|
JobObjectExtendedLimitInformation
|
JOBOBJECT_EXTENDED_LIMIT_INFORMATION
|
基本的UI限额
|
JobObjectBasicUIRestrictions
|
JOBOBJECT_BASIC_UI_RESTRICTIONS
|
安全限额
|
JobObjectSecurityLimitInformation
|
JOBOBJECT_SECURITY_LIMIT_INFORMATION
|
三,将进程放入作业中
我们在将进程放入作业中时,常常调用CreateProcess来创建进程,且传入CREATE_SUSPENDED标志,暂时挂起进程。
注意:如果允许子进程立即开始执行代码,它会逃离我们的“沙箱”,成功地做些我们禁止它做的事情。所以,在创建子进程且允许它运行之前,必须调用一下函数,将进程显示地放入新建的作业中:
BOOL AssignProcessToJobObject(
HANDLE hJob,
HANDLE hProcess);
这个函数将向系统表明将此进程当作现有作业的一部分。注意,这个函数只允许将尚未分配给任何作业的一个进程分配给一个作业。一旦一个进程分配到一个作业中,它就不能分配到其他作业中。
在调用了AssignProcessToJobObject之后,再调用ResumeThread,使进程的线程可以在作业的限制下执行代码。
四,终止作业中的所有进程
BOOL TerminateJobObject(
HANDLE hJob,
UINT uExitCode);
这类似于为作业内的每一个进程调用TerminateProcess,将所有退出代码设为uExitCode。
五,作业通知
如果只是关心所分配的CPU时间是否已经过期,那么可以非常简单的获得这个通知,作业中进程如果还没有用完已分配的CPU时间,作业就处于未触发的状态,一旦作业用完所分配的时间windows就会强行杀死作业中所有的进程,触发作业对象
。
WaitForSingleObject()可以轻松捕获这个事件。
分享到:
相关推荐
Windows编程主要涉及Win32 API,这是Microsoft为Windows操作系统提供的核心编程接口。开发者可以通过调用这些API函数来实现窗口管理、事件处理、图形绘制等功能。在这个射击游戏中,可能会用到如CreateWindow、...
《Windows 核心编程第五版》(Windows Via C/C++)是由Jeffrey Richter和Christophe Nasarre合著的,这本书主要关注于如何通过C/C++编程语言来深入Windows操作系统的核心编程。本书的英文原版PDF为那些希望深入理解...
这些函数都是Windows编程中处理用户输入和定时任务的核心机制。 3. 画圆的GDI函数:在文件中可以看到使用了Ellipse函数,这是GDI(图形设备接口)的一个函数,用于在指定的矩形内绘制一个椭圆,实际效果是画一个圆...
这个大作业涉及到的知识点广泛,涵盖了Windows编程的核心概念和技术。 1. **Windows程序开发环境**:此项目使用了Visual Studio IDE,通过`.vcxproj`和`.filters`文件可以看出,这是一款基于C++语言的Windows应用...
在探讨Windows多任务编程时,内核对象是一个核心概念,对于深入理解Windows操作系统的工作原理至关重要。本文将围绕这一主题展开,详细介绍Windows内核对象的基本概念、类型以及如何在实际编程中创建与使用这些对象...
C#的核心是面向对象编程(OOP),支持类、对象、接口、抽象类、继承、多态和封装等概念。通过这些特性,开发者可以构建模块化、可维护的代码。 3. **泛型** C#引入了泛型,允许开发者创建可重用的类型安全的数据...
Windows 操作系统的特点包括视窗界面、Unicode、进程、线程、作业、虚拟内存、内核态 / 用户态、对象与句柄、注册表等。 Windows 基本编程理论 Windows 编程的基本理论包括微软开发者网络 MSDN、API 调用与状态...
在Windows上配置Hadoop和Spark时,往往需要手动下载这些WinUtils工具,将其添加到系统路径,以便正确地运行Spark作业。这个压缩包提供的就是这些必要的工具,帮助开发者在Windows环境下搭建和测试Hadoop和Spark的...
### Windows核心系统编程(第五版中文)4-6章知识点概览 #### 第4章 进程 **主要内容概述:** 本章详细介绍了进程的概念、创建、终止等关键操作,并探讨了与进程相关的多种属性及如何对其进行管理和操作。 **详细...
该编程作业的核心知识点包括: 1. **图形用户界面(GUI)设计**:QQ屏幕截图工具的用户界面设计是其直观易用的关键。开发者需要使用如Java Swing、JavaFX、Qt、wxWidgets或Python的Tkinter等库来创建窗口、按钮、...
2.3 Windows API核心DLL 21 2.3.1 Kernel32.dll 21 2.3.2 User32.dll 21 2.3.3 Gdi32.dll 22 2.3.4 标准C函数 22 2.3.5 其他Dll 22 2.4 Unicode和多字节 22 2.4.1 W版本和A版本的API 24 2.4.2 ...
作业涵盖了一些核心的C++编程知识,以及Windows API的使用。 1. **C++基础**:C++的基础知识包括变量、数据类型、运算符、控制结构(如if语句和循环)、函数、数组、指针等。这些是任何C++程序员必备的基本功,用于...
这个Windows编程课件很可能是按照这些主题组织的,包含了理论讲解、实例演示和可能的作业,旨在帮助学习者逐步掌握Windows编程。通过深入学习和实践,你可以创建自己的Windows应用程序,甚至构建更高级的系统级组件...
1. **Hadoop架构**:Hadoop主要由两个核心组件组成——HDFS(Hadoop Distributed File System)和MapReduce。HDFS是一个分布式文件系统,用于存储大量数据;MapReduce则是一种并行处理模型,用于对HDFS中的数据进行...
在尚硅谷出版的《大数据之Scala语言核心编程》中,首先介绍了学习Scala语言的原因和Scala语言诞生的小故事。Scala诞生是为了提供一种更加简洁高效的编程方式,能够在同一套系统中处理结构化和非结构化数据。该书中还...
《编程Windows与MFC》是由Jeff Prosise撰写的一本关于使用C++编程的专著,主要聚焦于Microsoft Foundation Classes (MFC)库的应用。MFC是微软为简化Windows应用程序开发而设计的一个C++类库,它封装了Windows API,...
描述提到的是编程任务“deber de programación numer o6”,这可能是一个课程作业或者项目的一部分,要求进行特定的Windows平台开发。 在Windows编程中,开发者通常会使用API(应用程序接口)提供的函数来创建和...
对于大数据和云计算项目,Java是广泛使用的编程语言,因为其跨平台性、稳定性和丰富的开源库,尤其在大数据处理框架如Hadoop和Spark,以及云计算平台如OpenShift和Google App Engine中。 在大数据场景下,Java可以...
这篇文档是关于2020年网络工程与编程实践课程的作业要求,主要涉及网络通信、前端开发和数据库管理等多个IT领域。以下是根据标题、描述和标签生成的相关知识点: 1. **网络协议**:FTP(文件传输协议)、SMTP(简单...