Windows核心编程<读书笔记五>作业JOB

本文详细介绍了Windows作业管理的基本概念,包括作业的限制类型、如何设置限制、创建及加入进程、进程与作业的关系,以及如何查询作业信息。通过实例展示了如何限制进程的CPU时间、优先级和UI限制。

 

【文起】蟹儿,有你真好。想你,吻你。亲爱的,等豆豆回去哦

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


 【文尾】如果文章对您有用,请留下对我和蟹儿的祝福,谢谢~~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值