blocking wait function for process exit
This commit is contained in:
parent
c236b4eaaf
commit
c06402155e
|
|
@ -1260,6 +1260,7 @@ RLAPI int GetTouchPointCount(void); // Get number of t
|
||||||
// Process execution functions
|
// Process execution functions
|
||||||
RLAPI Process InitProcess(const char *command, char *const args[]); // Initialize a new process, returns a Process struct
|
RLAPI Process InitProcess(const char *command, char *const args[]); // Initialize a new process, returns a Process struct
|
||||||
RLAPI ProcessInfo CheckProcess(Process process); // Check if a process is still running
|
RLAPI ProcessInfo CheckProcess(Process process); // Check if a process is still running
|
||||||
|
RLAPI int WaitProcess(Process process); // Wait for process to finish, returns exit code, blocking
|
||||||
RLAPI void PauseProcess(Process process); // Pause process execution
|
RLAPI void PauseProcess(Process process); // Pause process execution
|
||||||
RLAPI void ResumeProcess(Process process); // Resume paused process execution
|
RLAPI void ResumeProcess(Process process); // Resume paused process execution
|
||||||
RLAPI void CloseProcess(Process process); // Close process and free resources
|
RLAPI void CloseProcess(Process process); // Close process and free resources
|
||||||
|
|
|
||||||
59
src/rcore.c
59
src/rcore.c
|
|
@ -4428,6 +4428,65 @@ RLAPI ProcessInfo CheckProcess(Process process)
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RLAPI int WaitProcess(Process process)
|
||||||
|
{
|
||||||
|
if (process.pid <= 0)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
// PROCESS_QUERY_INFORMATION | SYNCHRONIZE
|
||||||
|
// SYNCHRONIZE for WaitForSingleObject
|
||||||
|
void *hProcess = OpenProcess(0x0400 | 0x00100000, 0, (unsigned long)process.pid);
|
||||||
|
if (hProcess == NULL)
|
||||||
|
{
|
||||||
|
TRACELOG(LOG_WARNING, "PROCESS: Failed to open process handle");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait indefinitely for process termination
|
||||||
|
// INFINITE
|
||||||
|
WaitForSingleObject(hProcess, 0xFFFFFFFF);
|
||||||
|
|
||||||
|
// Get exit code
|
||||||
|
unsigned long exitCode = 0;
|
||||||
|
if (GetExitCodeProcess(hProcess, &exitCode))
|
||||||
|
{
|
||||||
|
CloseHandle(hProcess);
|
||||||
|
return (int)exitCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(hProcess);
|
||||||
|
return -1;
|
||||||
|
#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__)
|
||||||
|
int status = 0;
|
||||||
|
pid_t result = waitpid(process.pid, &status, 0);
|
||||||
|
|
||||||
|
if (result == process.pid)
|
||||||
|
{
|
||||||
|
if (WIFEXITED(status))
|
||||||
|
{
|
||||||
|
// Normal exit
|
||||||
|
return WEXITSTATUS(status);
|
||||||
|
}
|
||||||
|
else if (WIFSIGNALED(status))
|
||||||
|
{
|
||||||
|
// Terminated by signal
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TRACELOG(LOG_WARNING, "PROCESS: Failed to wait for process");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
TRACELOG(LOG_WARNING, "PROCESS: Process management not supported on this platform");
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Pause process execution
|
// Pause process execution
|
||||||
RLAPI void PauseProcess(Process process)
|
RLAPI void PauseProcess(Process process)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user