У меня есть сервер с двумя физическими процессорами. Я хочу установить текущий процесс для определенной группы, как будто я делаю это вручную из диспетчера задач. Обратите внимание, что это не сходство, а группа процессоров (каждая группа имеет 16 логических процессоров). Я не мог найти способ сделать это ни в C #, ни в C ++. В качестве альтернативы я попытался создать процесс с заданным атрибутом:
LPPROC_THREAD_ATTRIBUTE_LIST pAttribs = NULL;
WORD iNuma = 0;
STARTUPINFOEX sInfoEx;
sInfoEx.StartupInfo.cb = sizeof(sInfoEx);
DWORD size;
int success = InitializeProcThreadAttributeList(0, 1, 0, &size);
pAttribs = reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(HeapAlloc(GetProcessHeap(), 0, size));
success = InitializeProcThreadAttributeList(pAttribs, 1, 0, &size);
success = UpdateProcThreadAttribute(pAttribs, 0, PROC_THREAD_ATTRIBUTE_PREFERRED_NODE, &iNuma, sizeof(iNuma), NULL, NULL);
long err = GetLastError();
auto fCreationFlags = EXTENDED_STARTUPINFO_PRESENT;
PROCESS_INFORMATION pi = { 0 };
STARTUPINFOEX si = { 0 };
si.StartupInfo.cb = sizeof(si);
si.lpAttributeList = pAttribs;
int p = CreateProcess(NULL, L"notepad.exe", NULL, NULL, false, fCreationFlags, NULL, NULL, &si.StartupInfo, &pi);
При вызове CreateProcess происходит сбой приложения с нарушением прав доступа.
Этот код тоже не работает. Он просто изменяет сходство одного потока, но не влияет на группу процессов:
Как я могу установить сходство процессора в .NET?
В соответствии с документация, версия Unicode CreateProcess
Можно изменить параметр командной строки (второй). Передача константной строки (которую вы делаете) может привести к нарушению прав доступа.
Вам нужно будет пройти в string
или массив, который можно изменить.
Других решений пока нет …