0

我想使用 SetProcessWorkingSetSize 函数,在 MSDN 上我看到了这个:

“句柄必须具有 PROCESS_SET_QUOTA 访问权限。有关详细信息,请参阅进程安全和访问权限。”

那么,如何设置 PROCESS_SET_QUOTA 来处理句柄呢?

我想编写运行具有工作集限制的可执行程序的程序,所以有一段主要代码:

STARTUPINFO si;
    memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    GetStartupInfo(&si);
    si.dwFlags = 0;
    PROCESS_INFORMATION pi;

if (!CreateProcess(
        exePath.c_str(),
        cmdParametersBuffer,
        NULL,
        NULL,
        FALSE,
        NORMAL_PRIORITY_CLASS,
        NULL,
        NULL,
        &si,
        &pi))
    {
     cout << "error" << endl;
    }
SetProcessWorkingSetSize(pi.hProcess, 20 * 4 * 1024, 100*1024*1024);
4

2 回答 2

2

您是否真的尝试过您显示的代码并且它不适合您?如果是这样,GetLastError()报告什么错误?

如果您阅读文档,它会说:

进程安全和访问权限

PROCESS_ALL_ACCESS
进程对象的所有可能访问权限。
...
CreateProcess 函数返回的句柄具有对进程对象的 PROCESS_ALL_ACCESS 访问权限

因此,您应该能够SetProcessWorkingSetSize()CreateProcess()退出后调用,就像您展示的那样,无需做任何额外的事情来启用PROCESS_SET_QUOTA权限,因为它应该已经启用。

于 2014-04-08T20:40:09.293 回答
0

您的示例代码调用SetProcessWorkingSetSize()成功,因为您得到的错误是 0。如果您遇到类似的错误,0x522 ERROR_PRIVILEGE_NOT_HELD那么您就会知道调用失败。

了解应用程序应该能够分配比其工作集大小更多的内存可能会有所帮助。操作系统将从 RAM 中调出内存。如果您使用任务管理器查看您的进程的工作集,它实际上是否超出了您设置的配额?

您可能还需要使用SetProcessWorkingSetSizeEx标志 QUOTA_LIMITS_HARDWS_MAX_ENABLE来强制操作系统实际应用您的设置。

于 2016-07-28T18:02:42.320 回答