我正在使用creatprocess api创建子进程。我创建了一个jobobject并将此子进程分配给jobobject。
现在,如果我杀死我的父进程,子进程也会终止。但是如果我挂起父进程,子进程不会挂起并继续执行。
当父进程被暂停时,是否有任何选项可以暂停子进程?
我用于创建流程的Delphi代码
Function ExecuteProcess(EXE : String) : THandle;
Var
SI : TStartupInfo;
PI : TProcessInformation;
Begin
Result := INVALID_HANDLE_VALUE;
FillChar(SI,SizeOf(SI),0);
SI.cb := SizeOf(SI);
If
CreateProcess(nil,PChar('.\'+EXE),nil,nil,False,CREATE_SUSPENDED,
nil,nil,SI,PI) Then
Begin
ResumeThread(PI.hThread);
CloseHandle(PI.hThread);
Result := PI.hProcess;
End
Else ShowMessage('CreateProcess failed: '+
SysErrorMessage(GetLastError));
End;
答案 0 :(得分:4)
从Windows API的角度来看,没有暂停进程的事情。只能挂起线程,但线程之间没有父子关系。由于没有“子线程”,因此在父项被挂起时没有自动挂起它们的机制。 (你可以创建一个暂停的进程,但那是因为当它首次创建时,只有一个线程,它被创建暂停。)
如果要暂停子进程的所有线程,则enumerate them并以挂起父进程的线程的方式挂起它们。
您也可以尝试使用Windows: Atomically suspend an entire process?
中提到的无证NtSuspendProcess
函数