void FWindowsPlatformProcess::CloseProc(FProcHandle & ProcessHandle) { if (ProcessHandle.IsValid()) { ::CloseHandle(ProcessHandle.Get()); ProcessHandle.Reset(); } }
bool FWindowsPlatformProcess::IsProcRunning( FProcHandle & ProcessHandle ) { bool bApplicationRunning = true; uint32 WaitResult = ::WaitForSingleObject(ProcessHandle.Get(), 0); if (WaitResult != WAIT_TIMEOUT) { bApplicationRunning = false; } return bApplicationRunning; }
void FLinuxPlatformProcess::TerminateProc( FProcHandle & ProcessHandle, bool KillTree ) { if (KillTree) { // TODO: enumerate the children STUBBED("FLinuxPlatformProcess::TerminateProc() : Killing a subtree is not implemented yet"); } int KillResult = kill(ProcessHandle.Get(), SIGTERM); // graceful check(KillResult != -1 || errno != EINVAL); }
void FWindowsPlatformProcess::TerminateProc( FProcHandle & ProcessHandle, bool KillTree ) { if (KillTree) { HANDLE SnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (SnapShot != INVALID_HANDLE_VALUE) { ::DWORD ProcessId = ::GetProcessId(ProcessHandle.Get()); PROCESSENTRY32 Entry; Entry.dwSize = sizeof(PROCESSENTRY32); if (::Process32First(SnapShot, &Entry)) { do { if (Entry.th32ParentProcessID == ProcessId) { HANDLE ChildProcHandle = ::OpenProcess(PROCESS_ALL_ACCESS, 0, Entry.th32ProcessID); if (ChildProcHandle) { FProcHandle ChildHandle(ChildProcHandle); TerminateProc(ChildHandle, KillTree); // ::TerminateProcess(ChildProcHandle, 1); } } } while(::Process32Next(SnapShot, &Entry)); } } } TerminateProcess(ProcessHandle.Get(),0); }
bool FWindowsPlatformProcess::GetProcReturnCode( FProcHandle & ProcHandle, int32* ReturnCode ) { return ::GetExitCodeProcess( ProcHandle.Get(), (::DWORD *)ReturnCode ) && *((uint32*)ReturnCode) != ProcessConstants::WIN_STILL_ACTIVE; }
void FWindowsPlatformProcess::WaitForProc( FProcHandle & ProcessHandle ) { ::WaitForSingleObject(ProcessHandle.Get(), INFINITE); }