2013-07-31 229 views
0

我用CreateJobObjectA()創建一個作業,然後用CreateProcessA()創建一個新的進程,當我試圖將新進程分配給我用AssignProcessToJobObject()創建的作業時,它返回0 。所以我GetLastError()和即時獲得值6.根據Windows系統錯誤代碼意味着句柄無效。繼承人我的代碼。AssignProcessToJobObject失敗句柄無效

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。我只是不明白我的手柄是無效的。任何幫助將是驚人的。或者可能以不同的方式來做到這一點?

我想啓動這個新進程,並讓它成爲一個子進程,所以當我的主進程崩潰服務器也關閉。

謝謝。

回答

0

你有競爭條件。如果cmd.exe在您致電AssignProcessToJobObject之前退出,它將不起作用(我不確定您在該場景中得到的錯誤代碼)。

使用CREATE_SUSPENDED標誌啓動暫停進程,並且在您將其分配給作業之前不要恢復它。

相關問題