创建一个job的过程
- 判断一个进程是否在某个JOb内 IsProcessInJob
- 创建一个作业对象: CreateJobObject
- 把进程放到一个作业对象中:AssignProcessToJobObject
进程控制
我们要给作业中的进程施加一些限制或者说控制,那么就需要一个函数:SetInformationJobObject
BOOL WINAPI SetInformationJobObject(__in HANDLE hJob,__in JOBOBJECTINFOCLASS JobObjectInfoClass,__in LPVOID lpJobObjectInfo,__in DWORD cbJobObjectInfoLength);
- hJob:我们需要给那个作业对象添加限制条件,那么这就是那个作业的句柄。
- JobObjectInfoClass: 我们要给作业对象添加哪一类限制条件,这个参数是一个枚举,我们可选的枚举如下:
JobObjectBasicLimitInformation-2 JOBOBJECT_BASIC_LIMIT_INFORMATIONJobObjectBasicUIRestrictions-4 JOBOBJECT_BASIC_UI_RESTRICTIONSJobObjectSecurityLimitInformation-5 JOBOBJECT_SECURITY_LIMIT_INFORMATIONJobObjectEndOfJobTimeInformation-6 JOBOBJECT_END_OF_JOB_TIME_INFORMATIONJobObjectAssociateCompletionPortInformation-7 JOBOBJECT_ASSOCIATE_COMPLETION_PORTJobObjectGroupInformation-11 现在我们的家用计算机基本上只有一个组群0。
- lpJobObjectInfo: 我们要施加的具体限制,就保存在这个参数中,根据JobObjectInfoClass参数取值的不通,这个指针指向不通的结构体。
- cbJobObjectInfoLength: 第三个参数指向的内存块的大小 单位是 Bytes
JOBOBJECT_BASIC_LIMIT_INFORMATION结构体详细介绍
typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {LARGE_INTEGER PerProcessUserTimeLimit;LARGE_INTEGER PerJobUserTimeLimit;DWORD LimitFlags;SIZE_T MinimumWorkingSetSize;SIZE_T MaximumWorkingSetSize;DWORD ActiveProcessLimit;ULONG_PTR Affinity;DWORD PriorityClass;DWORD SchedulingClass;} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
- DWORD LimitFlags; //需要表明,这个结构体中,那个参数被设置!
- PerProcessUserTimeLimit : 每个进程的用户时间限制,每个进程消耗的用户模式下的CPU时间,单位是100纳秒。和显示时间不是很贴准。到时间,进程自动退出。
- LimitFlags= JOB_OBJECT_LIMIT_PROCESS_TIME;
- PerJobUserTimeLimit: 作业中所有进程一共消耗的用户模式下的CPU时间,单位是100纳秒。当这个时间到了,那么作业中的所有进程就退出。
- LimitFlags=JOB_OBJECT_LIMIT_JOB_TIME;
MinimumWorkingSetSize:
WorkingSetSize: //独占内存,参考连接[链接](https://bbs.csdn.net/topics/391848652),[将物理内存的占用挪到虚拟内存里-----揭密篇](https://blog.csdn.net/zlt982001/article/details/466879),[关于SetProcessWorkingSetSize减少内存占用 的错误理解](https://blog.csdn.net/yyws2039725/article/details/85480263)
PageFile: //页面文件,内存管理将暂时不使用的内存放入到磁盘文件系统
Windows中的内存管理: //WINDOWS核心编程——Windows内存管理,Windows内存原理与内存管理
MaximumWorkingSetSize:ActiveProcessLimit: 作业中做多能运行多少进程。如果超过这个限制,那么就不能将另外的进程和这个作业进行联系,如果要建立联系,那么 这个进程会退出。
- Affinity: 处理器列表。限制作业中的进程在那个处理器中运行。
- PriorityClass:
- SchedulingClass:
进程限制结构体
本次给进程一个限制条件,进程需要使用JOBOBJECT_BASIC_LIMIT_INFORMATION结构体
typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {LARGE_INTEGER PerProcessUserTimeLimit;LARGE_INTEGER PerJobUserTimeLimit;DWORD LimitFlags;SIZE_T MinimumWorkingSetSize;SIZE_T MaximumWorkingSetSize;DWORD ActiveProcessLimit;ULONG_PTR Affinity;DWORD PriorityClass;DWORD SchedulingClass;} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;LimitFlags: 这个参数,说明了结构体中,那个参数将要被设置!
完整代码
#include<Windows.h>#include<tchar.h>int main(){HANDLE hJob=CreateJobObject(NULL, NULL);STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi, sizeof(pi));//获取进程执行前的时间SYSTEMTIME time;GetSystemTime(&time);_tprintf(L"%d:%d\n", time.wMinute, time.wSecond);//创建进程BOOL re = CreateProcess(L"E:\\15pb\\one.exe", // No module name (use command line)NULL, // Command lineNULL, // Process handle not inheritableNULL, // Thread handle not inheritableFALSE, // Set handle inheritance to FALSE0, // No creation flagsNULL, // Use parent's environment blockNULL, // Use parent's starting directory&si, // Pointer to STARTUPINFO structure&pi); // Pointer to PROCESS_INFORMATION structure//将进程添加到job中re=AssignProcessToJobObject(hJob, pi.hProcess);if (re)_tprintf(L"AssingProcessToJobObject OK!\n");//定义一个限制对象JOBOBJECT_BASIC_LIMIT_INFORMATION info = { 0 };/*typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {LARGE_INTEGER PerProcessUserTimeLimit;LARGE_INTEGER PerJobUserTimeLimit;DWORD LimitFlags;SIZE_T MinimumWorkingSetSize;SIZE_T MaximumWorkingSetSize;DWORD ActiveProcessLimit;ULONG_PTR Affinity;DWORD PriorityClass;DWORD SchedulingClass;} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;LimitFlags: 这个参数,说明了结构体中,那个参数将要被设置!*///限制进程的时间info.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_TIME;LARGE_INTEGER t;t.QuadPart = 10;//进程的时间限制info.PerProcessUserTimeLimit = t;//给进程限制为1秒re=SetInformationJobObject(hJob, JobObjectBasicLimitInformation, &info, sizeof(info));if (!re){_tprintf(L"SetInformationJobObject errno=%d\n", GetLastError());}//进程job组限制info.LimitFlags = JOB_OBJECT_LIMIT_JOB_TIME;t.QuadPart = 10;info.PerJobUserTimeLimit = t;//给job组加以限制re = SetInformationJobObject(hJob, JobObjectBasicLimitInformation, &info, sizeof(info));if (!re){_tprintf(L"SetInformationJobObject errno=%d\n", GetLastError());}//_gettchar();CloseHandle(hJob);//等待进程执行完毕WaitForSingleObject(pi.hProcess, INFINITE);//获取进程执行完毕后的时间GetSystemTime(&time);_tprintf(L"%d:%d\n", time.wMinute, time.wSecond);_gettchar();return 0;}
