【文起】蟹兒,有你真好。想你,吻你。親愛的,等豆豆回去哦
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';
【文尾】如果文章對您有用,請留下對我和蟹兒的祝福,謝謝~~