blocxx
|
Class for communicating with and managing a child process. More...
#include <Process.hpp>
Classes | |
class | Status |
Portable process status. More... | |
Public Types | |
enum | ETerminationSelectionFlag { E_TERMINATE_PROCESS_GROUP , E_TERMINATE_PROCESS_ONLY } |
Public Member Functions | |
Process (UnnamedPipeRef const &in, UnnamedPipeRef const &out, UnnamedPipeRef const &err, ProcId pid) | |
Process (ProcId pid) | |
void | release () |
Releases ownership of the ProcId and UnnamedPipes held by this object. | |
virtual | ~Process () |
If release has been called on this object, does nothing. | |
UnnamedPipeRef | in () const |
Stdin for the child process. | |
UnnamedPipeRef | out () const |
Stdout for the child process. | |
UnnamedPipeRef | err () const |
Stderr for the child process. | |
ProcId | pid () const |
Process ID for the child process. | |
Status | processStatus () |
void | waitCloseTerm (const Timeout &wait_initial=Timeout::relative(5.0), const Timeout &wait_close=Timeout::relative(10.0), const Timeout &wait_term=Timeout::relative(15.0), ETerminationSelectionFlag terminationSelectionFlag=E_TERMINATE_PROCESS_GROUP) |
Waits for the child process to terminate, taking increasingly severe measures to ensure that this happens. | |
void | waitCloseTerm (float wait_initial, float wait_close, float wait_term) |
Waits for the child process to terminate, taking increasingly severe measures to ensure that this happens. | |
Protected Member Functions | |
Process (const ProcessImplRef &impl, UnnamedPipeRef const &in, UnnamedPipeRef const &out, UnnamedPipeRef const &err, ProcId pid) | |
Constructor for derived classes that allow them to override the implementation. | |
![]() | |
IntrusiveCountableBase () | |
IntrusiveCountableBase (const IntrusiveCountableBase &) | |
IntrusiveCountableBase & | operator= (const IntrusiveCountableBase &) |
virtual | ~IntrusiveCountableBase () |
Private Member Functions | |
bool | terminatesWithin (const Timeout &wait_time) |
ProcId | getCurProcessId () |
bool | killWait (const Timeout &wait_time, int sig, char const *signame, ETerminationSelectionFlag terminationSelectionFlag) |
Process (Process const &) | |
Copying not allowed (private) | |
void | operator= (Process const &) |
Assignment not allowed (private) | |
Private Attributes | |
ProcessImplRef | m_impl |
UnnamedPipeRef | m_in |
UnnamedPipeRef | m_out |
UnnamedPipeRef | m_err |
ProcId | m_pid |
Status | m_status |
Class for communicating with and managing a child process.
Definition at line 61 of file Process.hpp.
Enumerator | |
---|---|
E_TERMINATE_PROCESS_GROUP | The process and any descendent processes which are in the process group will be terminated. |
E_TERMINATE_PROCESS_ONLY | The process will be terminated. |
Definition at line 209 of file Process.hpp.
BLOCXX_NAMESPACE::Process::Process | ( | UnnamedPipeRef const & | in, |
UnnamedPipeRef const & | out, | ||
UnnamedPipeRef const & | err, | ||
ProcId | pid ) |
Definition at line 325 of file Process.cpp.
References err(), in(), m_err, m_impl, m_in, m_out, m_pid, m_status, out(), and pid().
Referenced by operator=(), and Process().
|
protected |
Constructor for derived classes that allow them to override the implementation.
This is necessary because destructors shouldn't call virtual functions (it's undefined behavior), so instead of this class having virtual functions, that is moved to ProcessImpl.
Definition at line 338 of file Process.cpp.
References err(), in(), m_err, m_impl, m_in, m_out, m_pid, m_status, out(), and pid().
BLOCXX_NAMESPACE::Process::Process | ( | ProcId | pid | ) |
|
virtual |
If release
has been called on this object, does nothing.
Otherwise, closes pipes and waits for process to die, killing it if necessary,
Definition at line 362 of file Process.cpp.
References BLOCXX_LOG_DEBUG, m_impl, m_pid, m_status, BLOCXX_NAMESPACE::Timeout::relative(), and waitCloseTerm().
|
private |
Copying not allowed (private)
References Process().
UnnamedPipeRef BLOCXX_NAMESPACE::Process::err | ( | ) | const |
Stderr for the child process.
The default timeout is set to 10 minutes.
Definition at line 413 of file Process.cpp.
References m_err.
|
private |
Definition at line 682 of file Process.cpp.
Referenced by waitCloseTerm().
UnnamedPipeRef BLOCXX_NAMESPACE::Process::in | ( | ) | const |
Stdin for the child process.
The default timeout is set to 10 minutes.
Definition at line 403 of file Process.cpp.
References m_in.
|
private |
Definition at line 660 of file Process.cpp.
References BLOCXX_THROW_ERRNO_MSG, BLOCXX_NAMESPACE::Format::c_str(), E_TERMINATE_PROCESS_GROUP, m_impl, m_pid, processStatus(), and terminatesWithin().
Referenced by waitCloseTerm().
|
private |
Assignment not allowed (private)
References Process().
UnnamedPipeRef BLOCXX_NAMESPACE::Process::out | ( | ) | const |
Stdout for the child process.
The default timeout is set to 10 minutes.
Definition at line 408 of file Process.cpp.
References m_out.
ProcId BLOCXX_NAMESPACE::Process::pid | ( | ) | const |
Process ID for the child process.
Definition at line 418 of file Process.cpp.
References m_pid.
Referenced by Process(), Process(), Process(), and BLOCXX_NAMESPACE::Process::Status::Status().
Process::Status BLOCXX_NAMESPACE::Process::processStatus | ( | ) |
ProcessErrorException |
Definition at line 423 of file Process.cpp.
References m_impl, m_pid, and m_status.
Referenced by BLOCXX_NAMESPACE::Exec::feedProcessAndGatherOutput(), BLOCXX_NAMESPACE::Exec::feedProcessAndGatherOutput(), killWait(), BLOCXX_NAMESPACE::Exec::system(), and waitCloseTerm().
void BLOCXX_NAMESPACE::Process::release | ( | ) |
Releases ownership of the ProcId and UnnamedPipes held by this object.
in()
, out()
, and err()
are all null; pid()
< 0; the dtor does nothing. Only the above-mentioned methods may be called on this object. Definition at line 395 of file Process.cpp.
References BLOCXX_INVALID_HANDLE, m_err, m_in, m_out, and m_pid.
|
private |
Definition at line 530 of file Process.cpp.
References BLOCXX_NAMESPACE::TimeoutTimer::expired(), BLOCXX_NAMESPACE::TimeoutTimer::loop(), m_impl, m_pid, m_status, and BLOCXX_NAMESPACE::Thread::sleep().
Referenced by killWait(), and waitCloseTerm().
void BLOCXX_NAMESPACE::Process::waitCloseTerm | ( | const Timeout & | wait_initial = Timeout::relative(5.0), |
const Timeout & | wait_close = Timeout::relative(10.0), | ||
const Timeout & | wait_term = Timeout::relative(15.0), | ||
ETerminationSelectionFlag | terminationSelectionFlag = E_TERMINATE_PROCESS_GROUP ) |
Waits for the child process to terminate, taking increasingly severe measures to ensure that this happens.
All timeouts are measured from the start of the function. The following steps are taken in order until termination is detected:
SIGTERM
signal and waits until wait_term expires for it to die.SIGKILL
signal.In steps 1-3 the function returns as soon as termination is detected. If this function is called a second time it is a no-op, because it immediately sees that the process has already terminated.
SIGTERM
signal is sent.ProcessErrorException |
Definition at line 449 of file Process.cpp.
References BLOCXX_NAMESPACE::TimeoutTimer::asAbsoluteTimeout(), BLOCXX_THROW, BLOCXX_NAMESPACE::Timeout::E_RELATIVE, getCurProcessId(), BLOCXX_NAMESPACE::Timeout::getRelative(), BLOCXX_NAMESPACE::Timeout::getType(), killWait(), m_err, m_in, m_out, m_pid, m_status, processStatus(), BLOCXX_NAMESPACE::Timeout::relative(), and terminatesWithin().
Referenced by BLOCXX_NAMESPACE::Exec::feedProcessAndGatherOutput(), BLOCXX_NAMESPACE::Exec::feedProcessAndGatherOutput(), BLOCXX_NAMESPACE::Exec::system(), waitCloseTerm(), and ~Process().
void BLOCXX_NAMESPACE::Process::waitCloseTerm | ( | float | wait_initial, |
float | wait_close, | ||
float | wait_term ) |
Waits for the child process to terminate, taking increasingly severe measures to ensure that this happens.
All times are measured from the start of the function. The following steps are taken in order until termination is detected:
SIGTERM
signal and waits until wait_term seconds have passed for it to die.SIGKILL
signal.In steps 1-3 the function returns as soon as termination is detected. If this function is called a second time it is a no-op, because it immediately sees that the process has already terminated.
SIGTERM
signal is sent.ProcessErrorException |
Definition at line 444 of file Process.cpp.
References BLOCXX_NAMESPACE::Timeout::relative(), and waitCloseTerm().
|
private |
Definition at line 288 of file Process.hpp.
Referenced by err(), Process(), Process(), Process(), release(), and waitCloseTerm().
|
private |
Definition at line 285 of file Process.hpp.
Referenced by killWait(), Process(), Process(), Process(), processStatus(), terminatesWithin(), and ~Process().
|
private |
Definition at line 286 of file Process.hpp.
Referenced by in(), Process(), Process(), Process(), release(), and waitCloseTerm().
|
private |
Definition at line 287 of file Process.hpp.
Referenced by out(), Process(), Process(), Process(), release(), and waitCloseTerm().
|
private |
Definition at line 289 of file Process.hpp.
Referenced by killWait(), pid(), Process(), Process(), Process(), processStatus(), release(), terminatesWithin(), waitCloseTerm(), and ~Process().
|
private |
Definition at line 290 of file Process.hpp.
Referenced by Process(), Process(), Process(), processStatus(), terminatesWithin(), waitCloseTerm(), and ~Process().