Windows核心編程作業JOB

 

【文起】蟹兒,有你真好。想你,吻你。親愛的,等豆豆回去哦

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,這個作業只能運行1sCPU時間

目前我設置了兩個限制,把標記置上

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';


 【文尾】如果文章對您有用,請留下對我和蟹兒的祝福,謝謝~~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章