提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 前言
- 一、作業job是什么?
- 二、使用步驟
- 1.代碼示例
- 總結
前言
提示:這里可以添加本文要記錄的大概內容:
winapi網站:
https://learn.microsoft.com/en-us/windows/win32/api/
提示:以下是本篇文章正文內容,下面案例可供參考
一、作業job是什么?
作業(Job)基本概念
Windows作業(Job)對象是一種進程管理機制,允許將一組進程作為單個單元進行管理。它主要用于:
限制進程資源使用(CPU/內存等)
控制進程安全性
確保進程樹同步終止
監控進程運行狀態
作業job可以看作是進程池
核心API函數
#include <windows.h>
#include <stdio.h>
主要API:
CreateJobObject - 創建作業對象
AssignProcessToJobObject - 將進程分配到作業
SetInformationJobObject - 設置作業限制
TerminateJobObject - 終止作業內所有進程
IsProcessInJob 判斷是否已加入job
WINBASEAPI
HANDLE
WINAPI
CreateJobObjectW(_In_opt_ LPSECURITY_ATTRIBUTES lpJobAttributes, //安全屬性_In_opt_ LPCWSTR lpName //名字);WINBASEAPI
BOOL
WINAPI
SetInformationJobObject(_In_ HANDLE hJob, //句柄_In_ JOBOBJECTINFOCLASS JobObjectInformationClass, //job限制枚舉定義_In_reads_bytes_(cbJobObjectInformationLength) LPVOID lpJobObjectInformation, //作業限制結構_In_ DWORD cbJobObjectInformationLength //作業限制結構長度);WINBASEAPI
BOOL
WINAPI
IsProcessInJob(_In_ HANDLE ProcessHandle,_In_opt_ HANDLE JobHandle,_Out_ PBOOL Result);
WINBASEAPI
BOOL
WINAPI
AssignProcessToJobObject(_In_ HANDLE hJob,_In_ HANDLE hProcess);WINBASEAPI
BOOL
WINAPI
TerminateJobObject(_In_ HANDLE hJob,_In_ UINT uExitCode);WINBASEAPI
BOOL
WINAPI
SetInformationJobObject(_In_ HANDLE hJob,_In_ JOBOBJECTINFOCLASS JobObjectInformationClass,_In_reads_bytes_(cbJobObjectInformationLength) LPVOID lpJobObjectInformation,_In_ DWORD cbJobObjectInformationLength);
實際應用場景
批量任務管理:同時啟動/終止一組相關進程
資源隔離:防止子進程消耗過多系統資源
安全沙箱:限制進程的操作能力
服務管理:確保服務進程及其子進程同步管理
注意事項
進程一旦加入作業就無法移除
作業內的進程創建的子進程會自動加入同一作業
需要Windows 2000及以上系統支持
調試時需注意作業限制可能導致進程異常終止
二、使用步驟
1.代碼示例
代碼如下(示例):
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <tchar.h>int main()
{std::cout << "Hello World!\n";HANDLE hJob;JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo = { 0 };hJob = CreateJobObject(NULL, TEXT("MySampleJob"));if (hJob == NULL) {printf("CreateJobObject failed (%d)\n", GetLastError());return -1;}// 2. 設置作業限制(此處限制內存為100MB)jobInfo.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_MEMORY;jobInfo.ProcessMemoryLimit = 100 * 1024 * 1024; // 100MB if (!SetInformationJobObject(hJob,JobObjectExtendedLimitInformation,&jobInfo,sizeof(jobInfo))) {printf("SetInformationJobObject failed (%d)\n", GetLastError());CloseHandle(hJob);return -1;}// 3. 創建進程并分配到作業 STARTUPINFO si = { sizeof(si) };PROCESS_INFORMATION pi;wchar_t cmdLine[] = L"notepad.exe";if (!CreateProcess(NULL,cmdLine,NULL,NULL,FALSE,CREATE_SUSPENDED,NULL,NULL,&si,&pi)) {printf("CreateProcess failed (%d)\n", GetLastError());CloseHandle(hJob);return -1;}// 4. 分配進程到作業 if (!AssignProcessToJobObject(hJob, pi.hProcess)) {printf("AssignProcessToJobObject failed (%d)\n", GetLastError());TerminateProcess(pi.hProcess, 0);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);CloseHandle(hJob);return -1;}// 5. 恢復進程執行 ResumeThread(pi.hThread);printf("Job created successfully with process ID: %d\n", pi.dwProcessId);// 清理句柄 CloseHandle(pi.hProcess);CloseHandle(pi.hThread);CloseHandle(hJob);return 0;
}
總結
介紹了windows下作業job的基礎概念和使用。