【文起】蟹儿,有你真好。想你,吻你。亲爱的,等豆豆回去哦
jobli.LimitFlags = JOB_OBJECT_LIMIT_JOB_TIME | JOB_OBJECT_LIMIT_PRIORITY_CLASS ;
作业
作业可以理解为是进程的容器,对运行的进程做一种限制。
对于作业进行限制,有四种类型的枚举:
|
限制类型 |
第二个参数的值 |
第三个参数的结构 |
|
基本限制 |
JobObjectBasicLimitInformation |
JOBOBJECT_BASIC_LIMIT_INFORMATION |
|
扩展基本限制 |
JobObjectExtendedLimitInformation |
JOBOBJECT_EXTENDED_LIMIT_INFORMATION |
|
基本UI限制 |
JobObjectBasicUIRestrictions |
JOBOBJECT_BASI_CUI_RESTRICTIONS |
|
安全性限制 |
JobObjectSecurityLimitInformation |
JOBOBJECT_SECURITY_LIMIT_INFORMATION |
一般做法是,先定义一个Job
HANDLE hjob = CreateJobObject(NULL,NULL);
然后根据要限制的类型,定义结构值,比如:要定义一个基本限制:
JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = {0};
将要限制的属性添加到结构中去:
jobli.PriorityClass = IDLE_PRIORITY_CLASS;
jobli.PerJobUserTimeLimit = 10000000; // 1代表100ns,这个作业只能运行1s的CPU时间
目前我设置了两个限制,把标记置上
jobli.LimitFlags = JOB_OBJECT_LIMIT_JOB_TIME | JOB_OBJECT_LIMIT_PRIORITY_CLASS ;
把限制属性赋给job
SetInformationJobObject(hjob,JobObjectBasicLimitInformation,&jobli,sizeof(jobli));
同样,设置基本UI限制:
JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;
jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_EXITWINDOWS | JOB_OBJECT_UILIMIT_NONE | JOB_OBJECT_UILIMIT_HANDLES;
SetInformationJobObject(hjob,JobObjectBasicUIRestrictions,&jobuir,sizeof(jobuir));
创建一个进程(如果该进程产生子进程,那么该子进程会自动成为作业的一部分哦)
将该进程加入作业中:
AssignProcessToJobObject(hjob,pi.hProcess);
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi;
TCHAR szcomline[] = _T("CMD");//记得上一章的内容么?CreateProcess第二参数不能为只读哦
CreateProcess(NULL,szcomline,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi);//先不让进程执行
现在可以让进程执行了:
ResumeThread(pi.hThread);
CloseHandle(pi.hThread);等待进程停止或者作业达到允许的CPU执行时间:HANDLE han[2];
han[0] = pi.hProcess;
han[1] = hjob;
DWORD dw = WaitForMultipleObjects(2,han,FALSE,INFINITE);
switch(dw - WAIT_OBJECT_0)
{
case 0:
cout<<"The process has terminated";
break;
case 1:
cout<<"All of the job's allotted CPU time was used";
break;
}
CloseHandle(pi.hProcess);
CloseHandle(hjob);
查询JOB信息:
首先必须确定在作业中看到多少进程,然后分配足够的内存块,调用QueryInformationJobObject函数。
如,我们想查看10个进程信息,且看下这个job里面设置的信息
DWORD cb = sizeof(JOBOBJECT_BASIC_PROCESS_ID_LIST) + (10 -1) * sizeof(DWORD);
PJOBOBJECT_BASIC_PROCESS_ID_LIST pjobpil = (PJOBOBJECT_BASIC_PROCESS_ID_LIST)_alloca(cb);
pjobpil->NumberOfAssignedProcesses = 10;
QueryInformationJobObject(hjob,JobObjectBasicProcessIdList,
pjobpil,cb,&cb);
for (int x = 0; x < pjobpil->NumberOfProcessIdsInList;x++)
{
cout<<pjobpil->ProcessIdList[x]<<'\n';
}
DWORD sz = sizeof(JOBOBJECT_BASIC_ACCOUNTING_INFORMATION);
JOBOBJECT_BASIC_ACCOUNTING_INFORMATION *ts = (JOBOBJECT_BASIC_ACCOUNTING_INFORMATION *)_alloca(sz);
QueryInformationJobObject(hjob,JobObjectBasicAccountingInformation,ts,sz,&sz);
//cout<<"ActiveProcesses:"<<ts->ActiveProcesses<<'****\n';
//cout<<"ThisPeriodTotalKernelTime:"<<ts->ThisPeriodTotalKernelTime<<'\n';
//cout<<"ThisPeriodTotalUserTime:"<<ts->ThisPeriodTotalUserTime<<'\n'
//cout<<"TotalKernelTime:"<<ts->TotalKernelTime<<'\n'
cout<<"TotalPageFaultCount:"<<ts->TotalPageFaultCount<<'\n'
<<"TotalProcesses:"<<ts->TotalProcesses<<'\n'
<<"TotalTerminatedProcesses:"<<ts->TotalTerminatedProcesses<<'\n';
//<<"TotalUserTime:"<<ts->TotalUserTime<<'\n';
【文尾】如果文章对您有用,请留下对我和蟹儿的祝福,谢谢~~
本文详细介绍了Windows作业管理的基本概念,包括作业的限制类型、如何设置限制、创建及加入进程、进程与作业的关系,以及如何查询作业信息。通过实例展示了如何限制进程的CPU时间、优先级和UI限制。

5854

被折叠的 条评论
为什么被折叠?



