AssignProcessToJobObject失败句柄无效

AssignProcessToJobObject Failing The Handle is Invalid

本文关键字:无效 句柄 失败 AssignProcessToJobObject      更新时间:2023-10-16

我用CreateJobObjectA()创建一个作业,然后用CreateProcessA()新建一个进程,当我试图将新进程分配给我用AssignProcessToJobObject()创建的作业时,它返回0。所以我获取LastError(),得到一个值6。根据Windows系统的错误代码,这意味着句柄无效。这是我的密码。

HANDLE job = CreateJobObjectA( NULL, "jobName" );
if( job == NULL )
{
    printf( "Job is NULL" );
}
else
{
    JOBJECT_EXTENDED_LIMIT_INFORMATION jeli = { 0 };
    jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
    if( 0 == SetInformationJobObject( job, JobObjectExtendedLimitInformation, &jeli, sizeof(jeli)))
    {
        printf("Could not SetInformationJobObjectn");
    }
}
if( CreateProcessA( "C:\Windows\SysWOW64\cmd.exe", "/c server.bat", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
    printf("CreateProcess succeeded.n");
    if( job != NULL )
    {
        HANDLE derp =  processInfo.hProcess;
        if( derp != NULL )
        {
            if( 0 == AssignProcessToJobObject( job, derp ))
            {
                printf("Could not AssignProcessToObjectn");
                DWORD err = GetLastError();
                printf("derp");
            }
        }
    }
    //Can we free handles now? Not sure about this.
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);
}

bat文件正在做它应该做的事情,并启动一个运行服务器的jar。我只是不明白我的句柄是怎么失效的。任何帮助都将是惊人的。或者可能是另一种方式?

我想启动这个新进程,并将其作为子进程,这样当我的主进程崩溃时,服务器也会关闭。

谢谢。

您有一个竞赛条件。如果cmd.exe在调用AssignProcessToJobObject之前退出,它将不起作用(我不确定在这种情况下会得到什么错误代码)。

使用CREATE_SUSPENDED标志启动挂起的进程,在将其分配给作业之前不要继续执行。