创建一个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_INFORMATION
JobObjectBasicUIRestrictions-4 JOBOBJECT_BASIC_UI_RESTRICTIONS
JobObjectSecurityLimitInformation-5 JOBOBJECT_SECURITY_LIMIT_INFORMATION
JobObjectEndOfJobTimeInformation-6 JOBOBJECT_END_OF_JOB_TIME_INFORMATION
JobObjectAssociateCompletionPortInformation-7 JOBOBJECT_ASSOCIATE_COMPLETION_PORT
JobObjectGroupInformation-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 line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // 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;
}