如何设置PROCESS_set_QUOTA进行处理
How to set PROCESS_SET_QUOTA to process?
我想使用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);
您是否真的尝试了显示的代码,但它对您不起作用?如果是,GetLastError()
报告的错误是什么?
如果你阅读了文件,上面写着:
进程安全和访问权限
PROCESS_ALL_ACCESS
进程对象的所有可能访问权限
…
CreateProcess函数返回的句柄具有对过程对象的PROCESS_ALL_ACCESS访问权限
因此,您应该能够在CreateProcess()
退出后调用SetProcessWorkingSetSize()
,就像您所展示的那样,而不需要做任何额外的操作来启用PROCESS_SET_QUOTA
权限,因为它应该已经启用了。
您的示例代码正在成功调用SetProcessWorkingSetSize()
,因为您得到的错误为0。如果您遇到类似0x522 ERROR_PRIVILEGE_NOT_HELD
的错误,那么您就知道呼叫失败了。
了解应用程序应该能够分配比工作集大小更多的内存,这可能会有所帮助。操作系统将从RAM中调出内存。如果您使用任务管理器来查看流程的工作集,它实际上是否超过了您设置的配额?
您可能还需要使用SetProcessWorkingSetSizeEx
wth标志QUOA_LIMITS_HARDWS_MAX_ENABLE来强制操作系统实际应用您的设置。
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- google test PrintTo for std::set<std::string>