我用CreateJobObjectA()创建一个作业,然后用CreateProcessA()创建一个新进程,当我尝试将新进程分配给我用AssignProcessToJobObject()创建的作业时,它返回0.所以我GetLastError()并且我得到的值为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 SetInformationJobObject\n");
}
}
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 AssignProcessToObject\n");
DWORD err = GetLastError();
printf("derp");
}
}
}
//Can we free handles now? Not sure about this.
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
}
bat文件正在执行它应该执行的操作并启动运行服务器的jar。我只是不知道我的Handle是如何无效的。任何帮助都会很棒。或者可能采用不同的方式来做到这一点?
我想启动这个新进程并让它成为子进程,所以当我的主进程崩溃时,服务器也会关闭。
谢谢。
答案 0 :(得分:0)
你有一个竞争条件。如果cmd.exe
在您致电AssignProcessToJobObject
之前退出,则无效(我不确定您在该方案中获得的错误代码)。
使用CREATE_SUSPENDED
标志启动暂停进程,并且在您已将其分配给作业之前不要恢复该进程。