windows作业job介绍

发布于:2025-05-01 ⋅ 阅读:(17) ⋅ 点赞:(0)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
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的基础概念和使用。


网站公告

今日签到

点亮在社区的每一天
去签到