Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用过程线程属性首选节点或过程线程属性组关联时出现CreateProcess问题_C_Windows_Sdk_64 Bit_Createprocess - Fatal编程技术网

使用过程线程属性首选节点或过程线程属性组关联时出现CreateProcess问题

使用过程线程属性首选节点或过程线程属性组关联时出现CreateProcess问题,c,windows,sdk,64-bit,createprocess,C,Windows,Sdk,64 Bit,Createprocess,当我调用CreateProcess并使用PROC\u THREAD\u ATTRIBUTE\u GROUP\u AFFINITY extended属性时,我不断得到错误87、错误\u无效\u参数。我使用完全相同的代码调用CreateRemoteThreadEx,这很好。此外,PROC_线程_属性_首选_节点似乎没有效果。那么我做错了什么 Microsoft Windows Server 2008 R2企业版,6.1.7601 SP1版本7601 我甚至安装了这个服务包: 下面是示例代码: #in

当我调用CreateProcess并使用PROC\u THREAD\u ATTRIBUTE\u GROUP\u AFFINITY extended属性时,我不断得到错误87、错误\u无效\u参数。我使用完全相同的代码调用CreateRemoteThreadEx,这很好。此外,PROC_线程_属性_首选_节点似乎没有效果。那么我做错了什么

Microsoft Windows Server 2008 R2企业版,6.1.7601 SP1版本7601

我甚至安装了这个服务包:

下面是示例代码:

#include <windows.h>

typedef unsigned __int64 QWORD;

class CErr {
public:
    CErr(LPCSTR szFunc, DWORD nErr) {
        char szBuf[0x10000];
        DWORD fFlags = FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM;
        DWORD fLang =  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
        if (!nErr)
            nErr = GetLastError();
        FormatMessage(fFlags, NULL, nErr, fLang, szBuf, sizeof(szBuf) - 1, NULL);
        printf("%s: %s", szFunc, szBuf);
    }
};

int main(int argc, char* argv[])
{
    DWORD nErr;
    size_t cb;
    char sAttribsBuf[4096];
    auto pAttribs = (PPROC_THREAD_ATTRIBUTE_LIST)sAttribsBuf;

    if (!InitializeProcThreadAttributeList(NULL, 1, 0, &cb)
     && ((nErr = GetLastError()) != ERROR_INSUFFICIENT_BUFFER)) 
        throw CErr("InitializeProcThreadAttributeList", nErr);
    if (!InitializeProcThreadAttributeList(pAttribs, 1, 0, &cb))
        throw CErr("InitializeProcThreadAttributeList", 0);

#if 1 // if enabled, CreateProcess succeeds, but doesn't set affinity 

    WORD iNuma = 1;  // WORD is the only size that does not error here
    if (!UpdateProcThreadAttribute(pAttribs, 0, PROC_THREAD_ATTRIBUTE_PREFERRED_NODE,
     &iNuma, sizeof(iNuma), NULL, NULL))
        throw CErr("UpdateProcThreadAttribute", 0);

#else // if enabled, CreateProcess fails with ERROR_INVALID_PARAMETERS(87)

    GROUP_AFFINITY GrpAffinity = { 0 };
    GrpAffinity.Mask = 1;
    if (!UpdateProcThreadAttribute(pAttribs, 0, PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY, 
     &GrpAffinity, sizeof(GrpAffinity), NULL, NULL))
        throw CErr("UpdateProcThreadAttribute", 0);

#endif

    auto fCreationFlags = EXTENDED_STARTUPINFO_PRESENT;
    PROCESS_INFORMATION pi = { 0 };                     
    STARTUPINFOEX si = { 0 };
    si.StartupInfo.cb = sizeof(si);
    si.lpAttributeList = pAttribs;
    if (!CreateProcess(NULL, "notepad.exe", NULL, NULL, false, fCreationFlags, 
     NULL, NULL, &si.StartupInfo, &pi))
        throw CErr("CreateProcess", 0);  // error if ...ATTRIBUTE_GROUP_AFFINITY

    // SetProcessAffinityMask(pi.hProcess,1);  // if enabled, notepad's affinity is set

    WaitForSingleObject(pi.hProcess, INFINITE);

    DeleteProcThreadAttributeList(pAttribs);

    return 0;
}
#包括
typedef unsigned_uuint64 QWORD;
类CErr{
公众:
CErr(LPCSTR szFunc,德沃德·内尔){
char szBuf[0x10000];
DWORD fFlags=格式\消息\忽略\插入\格式\消息\来自\系统;
DWORD fLang=MAKELANGID(语言中性,子语言默认);
如果(!nErr)
nErr=GetLastError();
FormatMessage(fFlags,NULL,nErr,fLang,szBuf,sizeof(szBuf)-1,NULL);
printf(“%s:%s”,szFunc,szBuf);
}
};
int main(int argc,char*argv[])
{
德沃德·内尔;
尺寸t cb;
char-sAttribsBuf[4096];
自动排列=(PPROC_线程_属性_列表)sAttribsBuf;
if(!InitializeProcThreadAttributeList(NULL、1、0和cb)
&&((nErr=GetLastError())!=ERROR\u缓冲区不足))
抛出CErr(“InitializeProcThreadAttributeList”,nErr);
if(!InitializeProcThreadAttributeList(1、0和cb))
抛出CErr(“InitializeProcThreadAttributeList”,0);
#如果1//如果启用,CreateProcess将成功,但不会设置关联
WORD iNuma=1;//WORD是此处唯一没有错误的大小
如果(!UpdateProcThreadAttribute,0,PROC_THREAD_ATTRIBUTE_PREFERRED_NODE,
&iNuma,sizeof(iNuma,NULL,NULL))
抛出CErr(“updateProctThreadAttribute”,0);
#else//如果启用,CreateProcess将失败,错误为\u无效\u参数(87)
组_亲和性GrpAffinity={0};
GrpAffinity.Mask=1;
如果(!UpdateProcThreadAttribute(0,进程线程属性组关联),
&GrpAffinity,sizeof(GrpAffinity,NULL,NULL))
抛出CErr(“updateProctThreadAttribute”,0);
#恩迪夫
自动fCreationFlags=存在扩展的启动信息;
进程信息pi={0};
STARTUPINFOEX si={0};
si.StartupInfo.cb=sizeof(si);
si.lpAttributeList=pAttribs;
如果(!CreateProcess(NULL,“notepad.exe”),NULL,NULL,false,fCreationFlags,
NULL、NULL和si.StartupInfo和pi))
抛出CErr(“CreateProcess”,0);//如果…属性\u组\u亲和性,则出错
//SetProcessAffinityMask(pi.hProcess,1);//如果启用,则设置记事本的关联
WaitForSingleObject(pi.hProcess,无限);
删除属性列表(pAttribs);
返回0;
}

从文档中看不清楚,但我想我找到了答案。PROC_线程_属性_首选_节点仅应与CreateProcess()一起使用。进程线程属性处理器和进程线程属性组关联只能与CreateThread()一起使用


PROC_THREAD_ATTRIBUTE_PREFERRED_节点可能正在设置进程与节点所在组中所有处理器的关联性。我无法验证它,因为我的测试系统在两个numa节点上只有12个内核。将PROC_THREAD_ATTRIBUTE_PREFERRED_NODE设置为0或1将设置与所有核心的关联性。我确实验证了CreateProcess创建的进程堆栈是否位于由PROC_THREAD_ATTRIBUTE_PREFERRED_节点指示的numa节点上。同样没有文档记录,传入的节点的大小必须为2字节。

硬件是什么样子的?GetNumaHighestNodeNumber()返回什么?好问题。它是一个Cisco UCSB-B200-M3:128GB Ram,2个NUMA节点,2*Xeon E5-2690@2.90GHz(8核,16个逻辑处理器)。