版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Windows程序设计
之
作业2.4线程作业的引入Windows提供了一个作业(job)内核对象,它允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么。可以将作业对象想象成一个进程容器。但是创建只包含一个进程的作业同样非常有用,因为这样可以对进程施加平时不能施加的限制
Windows并不维护进程之间的父/子关系。即使父进程已经终止运行,子进程仍然会继续运行。Win32APIWin32API提供了一系列处理作业的函数接口,来向应用程序提供多线程的功能用Win32API直接编写应用程序要求程序员对Windows操作系统有一定的了解直接用Win32API编写的应用程序,程序的执行代码小,运行效率高使用win32线程API创建作业对象HANDLECreateJobObject(PSECURITY_ATTRIBUTESpsa,PCTSTRpszName);最后一个参数对此作业对象进行命名,使其能够由另一个进程通过OpenJobObject函数进行访问对作业中的进程施加限制创建好一个作业之后,接着一般会根据作业中的进程能够执行哪些操作来建立一个沙箱(即施加限制)。可以向作业应用以下几种类型的限制:(1)基本限额和扩展基本限额,用于防止作业中的进程独占系统资源;(2)基本UI限制,用于防止作业内的进程更改用户界面;(3)安全限额,用于防止作业内的进程访问安全资源(文件。注册表子项等);对作业中的进程施加限制BOOLSetInformationJobObject(HANDLEhJob,//要限制的作业//枚举类型,制定要施加到限制类型JOBOBJECTINFOCLASSJobObjectInformationClass,PVOIDpJobObjectInformation,//数据结构地址,具体到限制设置DWORDcbJobObjectInformationSize);//数据结构大小对作业中的进程施加限制对作业中的进程施加限制对作业中的进程施加限制对作业中的进程施加限制查询作业限制BOOLQueryInformationJobObject(HANDLEhJob,JOBOBJECTINFOCLASSJobObjectInformationClass,PVOIDpvJobObjectInformation,DWORDcbJobObjectInformationLength,PDWORDpdwReturnLength);你为该函数传递作业的句柄(就像你对SetInformationJobObject操作时那样),这些句柄包括用于指明你想要的限制信息的枚举类型,函数要进行初始化的数据结构的地址,以及包含该结构的数据块的长度。最后一个参数是pdwReturnLength,用于指向该函数填写的DWORD,它告诉你有多少字节放入了缓存。如果你愿意的话,可以(并且通常)为该参数传递NULL。
QueryInformationJobObject第二个参数设置调用QueryInformationJobObject,为第二个参数传递JobObjectBasicAccountingInformation,并传递JOBOBJECT_BASIC_ACCOUNTING_INFORMATION结构的地址QueryInformationJobObject第二个参数设置调用QueryInformationJobObject,可以进行一次函数调用,以同时查询基本统计信息和I/O统计信息。为此,必须为第二个参数传递JobObjectBasicAndIoAccountingInformation,并传递JOBObject_BASIC_AND_IO_ACCOUNTING_INFORMATION结构的地址QueryInformationJobObject第二个参数设置调用QueryInformationJobObject作业对象信息查询BOOLGetProcessIoCounters(HANDLEhProcess,PIO_COUNTERSpIoCounters);
示例:HANDLEhJob=CreateJobObject(NULL,TEXT(“tian”));//创建作业对象AssignProcessToJobObject(hJob,GetCurrentProcess());进程放入作业中CloseHandle(hJob);//关闭作业hJob=OpenJobObject(JOB_OBJECT_ALL_ACCESS,FALSE,TEXT(“tian”));//打开作业
将进程放入作业中在将进程放入作业中时,常常调用CreateProcess来创建进程,且传入CREATE_SUSPENDED标志,暂时挂起进程。BOOLAssignProcessToJobObject(HANDLEhJob,HANDLEhProcess);这个函数将向系统表明将此进程当作现有作业的一部分。注意,这个函数只允许将尚未分配给任何作业的一个进程分配给一个作业。一旦一个进程分配到一个作业中,它就不能分配到其他作业中。在调用了AssignProcessToJobObject之后,再调用ResumeThread,使进程的线程可以在作业的限制下执行代码。注意:如果允许子进程立即开始执行代码,它会逃离我们的“沙箱”,成功地做些我们禁止它做的事情。所以,在创建子进程且允许它运行之前,必须调用一下函数,将进程显示地放入新建的作业中:访问作业对象HANDLEOpenJobObject(DWORDdwDesiredAccess,BOOLbInheritHandle,PCTSTRpszName);
示例:HANDLEhJob=CreateJobObject(NULL,TEXT(“tian”));//创建作业对象AssignProcessToJobObject(hJob,GetCurrentProcess());进程放入作业中CloseHandle(hJob);//关闭作业hJob=OpenJobObject(JOB_OBJECT_ALL_ACCESS,FALSE,TEXT(“tian”));//打开作业
验证当前进程是否在作业控制之下BOOLIsProcessInJob(HANDLEhProcess,//进程句柄HANDLEhJob,//作业句柄PBOOLpbInJob);使用:IsProcessInJob(GetCurrentProcess(),NULL,&bInJob);如果bInJob==True则在当前作业控制之下
作业通知如果只是关心所分配的CPU时间是否已经过期,那么可以非常简单的获得这个通知,作业中进程如果还没有用完已分配的CPU时间,作业就处于未触发的状态,一旦作业用完所分配的时间windows就会强行杀死作业中所有的进程,触发作业对象。WaitForSingleObject()可以轻松捕获这个事件
终止作业中的所有进程BOOLTerminateJobObject(HANDLEhJob,UINTuExitCode);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论