资源描述:
《Windows核心编程(第5版)ch05》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、第5章作业第5章作业本章内容5.1对作业中的进程施加限制5.2将进程放入作业中5.3终止作业中的所有进程5.4作业通知5.5JobLab示例程序我们经常都需要将一组进程当作单个实体来处理。例如,我们用VisualStudio来构建一个C++项目的时候,它会生成Cl.exe,后者可能必须生成更多的进程(比如编译器每次对源文件进行扫描的时候。①译注:在每次扫描过程中,都对源程序或源程序的中间结果从头到尾扫描一次,并进行相关的加工处理,从而生成新的中间结果或目标程序。)。但是,如果用户希望提前停止构建过程,VisualStudio必须能够以某种方式终止Cl.exe及其所有子
2、进程。虽然这是一个简单而常见的问题,但在MicrosoftWindows中解决起来非常难,这是由于Windows没有维护进程之间的父/子关系。具体地说,即使父进程已经终止运行,子进程仍在继续运行。设计一个服务器时,也必须把一组进程当作一个单独的组来处理。例如,一个客户端也许会请求服务器执行一个应用程序并将结果返回给客户端(该应用程序也许会生成自己的子进程)。由于许多客户端都可能连接到此服务器,所以服务器应该以某种方式限制客户端能请求的东西,避免任何一个客户端独占其所有资源。这些限制包括可以分配给客户端请求的最大CPU时间;最小工作集(workingset)和最大工作集
3、大小、禁止客户端应用程序关闭计算机以及安全限制。Windows提供了一个作业(job)内核对象,它允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么。最好将作业对象想象成一个进程容器。但是,创建只包含一个进程的作业同样非常有用,因为这样可以对进程施加平时不能施加的限制。下面是我编写的StartRestrictedProcess函数,该函数将一个进程放入一个作业中,以限制此进程具体能够做哪些事情,如下所示:voidStartRestrictedProcess(){//Checkifwearenotalreadyassociatedwithajob.//Ift
4、hisisthecase,thereisnowaytoswitchto//anotherjob.139第5章作业BOOLbInJob=FALSE;IsProcessInJob(GetCurrentProcess(),NULL,&bInJob);if(bInJob){MessageBox(NULL,TEXT("Processalreadyinajob"),TEXT(""),MB_ICONINFORMATION
5、MB_OK);return;}//Createajobkernelobject.HANDLEhjob=CreateJobObject(NULL,TEXT("Win
6、tellect_RestrictedProcessJob"));//Placesomerestrictionsonprocessesinthejob.//First,setsomebasicrestrictions.JOBOBJECT_BASIC_LIMIT_INFORMATIONjobli={0};//Theprocessalwaysrunsintheidlepriorityclass.jobli.PriorityClass=IDLE_PRIORITY_CLASS;//Thejobcannotusemorethan1secondofCPUtime.jobli.Per
7、JobUserTimeLimit.QuadPart=10000;//1secin100-nsintervals//Thesearetheonly2restrictionsIwantplacedonthejob(process).jobli.LimitFlags=JOB_OBJECT_LIMIT_PRIORITY_CLASS
8、JOB_OBJECT_LIMIT_JOB_TIME;SetInformationJobObject(hjob,JobObjectBasicLimitInformation,&jobli,sizeof(jobli));//Second,setsome
9、UIrestrictions.JOBOBJECT_BASIC_UI_RESTRICTIONSjobuir;jobuir.UIRestrictionsClass=JOB_OBJECT_UILIMIT_NONE;//Afancyzero//Theprocesscan'tlogoffthesystem.jobuir.UIRestrictionsClass
10、=JOB_OBJECT_UILIMIT_EXITWINDOWS;//Theprocesscan'taccessUSERobjects(suchasotherwindows)//inthesystem.jo