【问题标题】:How to set PROCESS_SET_QUOTA to process?如何设置 PROCESS_SET_QUOTA 来处理?
【发布时间】:2014-05-21 02:57:22
【问题描述】:

我想使用 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);

【问题讨论】:

  • 必须投反对票,网上充满了如何启用或禁用特权的示例。
  • 据我了解,此示例可以更改现有对象的权限。问题是如何设置权限来处理由 CreateProcess 创建的。所以,我在网上找不到任何答案,对不起。你能帮我解决这个问题吗?

标签: c++ winapi working-set


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    Process Security and Access Rights

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

    所以您应该能够在CreateProcess() 退出后调用SetProcessWorkingSetSize(),就像您展示的那样,无需执行任何额外操作来启用PROCESS_SET_QUOTA 权限,因为它应该已经启用。

    【讨论】:

    • 您好,感谢您的回答。 GetLastError 返回 0 我刚刚编写了这个应用程序 ideone.com/VqjrwL 并使用此代码示例运行它,但没有收到任何通知或错误消息。所以所有的工作就像我没有设置任何限制
    • 所以我将工作集大小设置为 100 Mb,但在应用程序中分配 1Gb 而没有错误或通知。
    • 那么,你能帮我解决这个问题吗?
    猜你喜欢
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多