创建一个job的过程

  1. 判断一个进程是否在某个JOb内 IsProcessInJob
  2. 创建一个作业对象: CreateJobObject
  3. 把进程放到一个作业对象中:AssignProcessToJobObject

进程控制

我们要给作业中的进程施加一些限制或者说控制,那么就需要一个函数:SetInformationJobObject

  1. BOOL WINAPI SetInformationJobObject(
  2. __in HANDLE hJob,
  3. __in JOBOBJECTINFOCLASS JobObjectInfoClass,
  4. __in LPVOID lpJobObjectInfo,
  5. __in DWORD cbJobObjectInfoLength
  6. );
  • hJob:我们需要给那个作业对象添加限制条件,那么这就是那个作业的句柄。
  • JobObjectInfoClass: 我们要给作业对象添加哪一类限制条件,这个参数是一个枚举,我们可选的枚举如下:
    1. JobObjectBasicLimitInformation-2 JOBOBJECT_BASIC_LIMIT_INFORMATION
    2. JobObjectBasicUIRestrictions-4 JOBOBJECT_BASIC_UI_RESTRICTIONS
    3. JobObjectSecurityLimitInformation-5 JOBOBJECT_SECURITY_LIMIT_INFORMATION
    4. JobObjectEndOfJobTimeInformation-6 JOBOBJECT_END_OF_JOB_TIME_INFORMATION
    5. JobObjectAssociateCompletionPortInformation-7 JOBOBJECT_ASSOCIATE_COMPLETION_PORT
    6. JobObjectGroupInformation-11 现在我们的家用计算机基本上只有一个组群0
  • lpJobObjectInfo: 我们要施加的具体限制,就保存在这个参数中,根据JobObjectInfoClass参数取值的不通,这个指针指向不通的结构体。
  • cbJobObjectInfoLength: 第三个参数指向的内存块的大小 单位是 Bytes

JOBOBJECT_BASIC_LIMIT_INFORMATION结构体详细介绍

  1. typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
  2. LARGE_INTEGER PerProcessUserTimeLimit;
  3. LARGE_INTEGER PerJobUserTimeLimit;
  4. DWORD LimitFlags;
  5. SIZE_T MinimumWorkingSetSize;
  6. SIZE_T MaximumWorkingSetSize;
  7. DWORD ActiveProcessLimit;
  8. ULONG_PTR Affinity;
  9. DWORD PriorityClass;
  10. DWORD SchedulingClass;
  11. } 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:

    1. 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结构体

  1. typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
  2. LARGE_INTEGER PerProcessUserTimeLimit;
  3. LARGE_INTEGER PerJobUserTimeLimit;
  4. DWORD LimitFlags;
  5. SIZE_T MinimumWorkingSetSize;
  6. SIZE_T MaximumWorkingSetSize;
  7. DWORD ActiveProcessLimit;
  8. ULONG_PTR Affinity;
  9. DWORD PriorityClass;
  10. DWORD SchedulingClass;
  11. } JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
  12. LimitFlags: 这个参数,说明了结构体中,那个参数将要被设置!

完整代码

  1. #include<Windows.h>
  2. #include<tchar.h>
  3. int main()
  4. {
  5. HANDLE hJob=CreateJobObject(NULL, NULL);
  6. STARTUPINFO si;
  7. PROCESS_INFORMATION pi;
  8. ZeroMemory(&si, sizeof(si));
  9. si.cb = sizeof(si);
  10. ZeroMemory(&pi, sizeof(pi));
  11. //获取进程执行前的时间
  12. SYSTEMTIME time;
  13. GetSystemTime(&time);
  14. _tprintf(L"%d:%d\n", time.wMinute, time.wSecond);
  15. //创建进程
  16. BOOL re = CreateProcess(L"E:\\15pb\\one.exe", // No module name (use command line)
  17. NULL, // Command line
  18. NULL, // Process handle not inheritable
  19. NULL, // Thread handle not inheritable
  20. FALSE, // Set handle inheritance to FALSE
  21. 0, // No creation flags
  22. NULL, // Use parent's environment block
  23. NULL, // Use parent's starting directory
  24. &si, // Pointer to STARTUPINFO structure
  25. &pi); // Pointer to PROCESS_INFORMATION structure
  26. //将进程添加到job中
  27. re=AssignProcessToJobObject(hJob, pi.hProcess);
  28. if (re)
  29. _tprintf(L"AssingProcessToJobObject OK!\n");
  30. //定义一个限制对象
  31. JOBOBJECT_BASIC_LIMIT_INFORMATION info = { 0 };
  32. /*
  33. typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
  34. LARGE_INTEGER PerProcessUserTimeLimit;
  35. LARGE_INTEGER PerJobUserTimeLimit;
  36. DWORD LimitFlags;
  37. SIZE_T MinimumWorkingSetSize;
  38. SIZE_T MaximumWorkingSetSize;
  39. DWORD ActiveProcessLimit;
  40. ULONG_PTR Affinity;
  41. DWORD PriorityClass;
  42. DWORD SchedulingClass;
  43. } JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;
  44. LimitFlags: 这个参数,说明了结构体中,那个参数将要被设置!
  45. */
  46. //限制进程的时间
  47. info.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_TIME;
  48. LARGE_INTEGER t;
  49. t.QuadPart = 10;
  50. //进程的时间限制
  51. info.PerProcessUserTimeLimit = t;
  52. //给进程限制为1秒
  53. re=SetInformationJobObject(hJob, JobObjectBasicLimitInformation, &info, sizeof(info));
  54. if (!re)
  55. {
  56. _tprintf(L"SetInformationJobObject errno=%d\n", GetLastError());
  57. }
  58. //进程job组限制
  59. info.LimitFlags = JOB_OBJECT_LIMIT_JOB_TIME;
  60. t.QuadPart = 10;
  61. info.PerJobUserTimeLimit = t;
  62. //给job组加以限制
  63. re = SetInformationJobObject(hJob, JobObjectBasicLimitInformation, &info, sizeof(info));
  64. if (!re)
  65. {
  66. _tprintf(L"SetInformationJobObject errno=%d\n", GetLastError());
  67. }
  68. //_gettchar();
  69. CloseHandle(hJob);
  70. //等待进程执行完毕
  71. WaitForSingleObject(pi.hProcess, INFINITE);
  72. //获取进程执行完毕后的时间
  73. GetSystemTime(&time);
  74. _tprintf(L"%d:%d\n", time.wMinute, time.wSecond);
  75. _gettchar();
  76. return 0;
  77. }