Library: Foundation
Package: Threading
Header: Poco/SignalHandler.h
Description
This helper class simplifies the handling of POSIX signals.
The class provides a signal handler (installed with installHandlers()) that translates certain POSIX signals (SIGILL, SIGBUS, SIGSEGV, SIGSYS) into C++ exceptions.
Internally, a stack of sigjmp_buf structs is maintained for each thread. The constructor pushes a new sigjmp_buf onto the current thread's stack. The destructor pops the sigjmp_buf from the stack.
The poco_throw_on_signal macro creates an instance of SignalHandler on the stack, which results in a new sigjmp_buf being created. The sigjmp_buf is then set-up with sigsetjmp().
The handleSignal() method, which is invoked when a signal arrives, checks if a sigjmp_buf is available for the current thread. If so, siglongjmp() is used to jump out of the signal handler.
Typical usage is as follows:
try { poco_throw_on_signal; ... } catch (Poco::SignalException&) { ... }
The best way to deal with a SignalException is to log as much context information as possible, to aid in debugging, and then to exit.
The SignalHandler can be disabled globally by compiling POCO and client code with the POCO_NO_SIGNAL_HANDLER macro defined.
Member Summary
Member Functions: handleSignal, install, jumpBuffer, jumpBufferVec, throwSignalException
Nested Classes
struct JumpBuffer
sigjmp_buf cannot be used to instantiate a std::vector, so we provide a wrapper struct.
Types
JumpBufferVec
typedef std::vector < JumpBuffer > JumpBufferVec;
Constructors
SignalHandler
Creates the SignalHandler.
Destructor
~SignalHandler
~SignalHandler();
Destroys the SignalHandler.
Member Functions
install
static void install();
Installs signal handlers for SIGILL, SIGBUS, SIGSEGV and SIGSYS.
jumpBuffer
sigjmp_buf & jumpBuffer();
Returns the top-most sigjmp_buf for the current thread.
throwSignalException
static void throwSignalException(
int sig
);
Throws a SignalException with a textual description of the given signal as argument.
handleSignal
static void handleSignal(
int sig
);
The actual signal handler.
jumpBufferVec
static JumpBufferVec & jumpBufferVec();
Returns the JumpBufferVec for the current thread.