You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SetInformationJobObject通过Job限制进程内存失效问题

问题:Job对象内存限制设置无生效问题

我正在编写一个简单程序,功能是接收进程ID(PID),通过Job对象限制该进程的内存使用。目前调用SetInformationJobObject()没有报错,但内存限制完全没生效。我用SysInternals工具集里的testlimit64.exe -d 2024 -c 1做测试,已经确认Job成功绑定到目标进程(调用TerminateJobObject()可以终止该进程)。

以下是我的代码:

#include <windows.h>
#include <stdio.h>

int main(void) {

    DWORD pid;
    HANDLE hJob = CreateJobObject(NULL, NULL);
    printf("Type in PID\n");
    scanf_s("%u",&pid);
    HANDLE hProc = OpenProcess(PROCESS_SET_QUOTA | PROCESS_TERMINATE,FALSE, pid);

    if (!hJob) {
        printf("Failed to create job, GetLastError() = %d\n",GetLastError());
        return 1;
    }
    
    if (!hProc) {
        printf("Failed to OpenProcess, GetLastError() = %d\n", GetLastError());
        return 1;
    }

    if (!AssignProcessToJobObject(hJob,hProc)) {
        printf("Failed to AssignProcessToJobObject, GetLastError() = %d\n", GetLastError());
        return 1;
    }

    JOBOBJECT_EXTENDED_LIMIT_INFORMATION info;
    info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_JOB_MEMORY;
    info.JobMemoryLimit = 536870912;//尝试设置为512MB

    if (!SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &info, sizeof(info))) {
        printf("Failed to SetInformationJobObject, GetLastError() = %d\n", GetLastError());
        return 1;
    }
    else {
        printf("进程%d的内存已被限制!!!\n按ENTER键关闭程序",pid);
        getchar();
        getchar();
    }

    TerminateJobObject(hJob, 0);
    CloseHandle(hJob);
    CloseHandle(hProc);

    return EXIT_SUCCESS;
}

我还尝试修改JOBOBJECT_EXTENDED_LIMIT_INFORMATION结构体的LimitFlags,如下设置依然没有效果:

info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_MEMORY;
info.ProcessMemoryLimit = 536870912;//尝试设置为512MB

内容的提问来源于stack exchange,提问作者user2494337

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 07:52:18